これが私の公式の最初の質問です。より良い SO 市民になる方法を学ぶことができるように、投稿に対するあらゆる/すべての批判を歓迎します。
私は、潜在的に大規模な電子メール オプトアウト リストを格納するために非リレーショナル DBMS を精査しており、それぞれの Python クライアント ライブラリを使用して、MongoDB または RethinkDB に傾倒しています。私のアプリケーションの問題点は一括挿入のパフォーマンスです。そのため、MongoDB と RethinkDB コレクションの両方に 5,000 のバッチで 20,000 レコードを挿入する 2 つの Python スクリプトをセットアップしました。
MongoDB Python スクリプト mongo_insert_test.py:
NUM_LINES = 20000
BATCH_SIZE = 5000
def insert_records():
collection = mongo.recips
i = 0
batch_counter = 0
batch = []
while i <= NUM_LINES:
i += 1
recip = {
'address': "test%d@test%d.com" % (i, i)
}
if batch_counter <= BATCH_SIZE:
batch.append(recip)
batch_counter += 1
if (batch_counter == BATCH_SIZE) or i == NUM_LINES:
collection.insert(batch)
batch_counter = 0
batch = []
if __name__ == '__main__':
insert_records()
ほぼ同一の RethinkDB Python スクリプト rethink_insert_test.py:
NUM_LINES = 20000
BATCH_SIZE = 5000
def insert_records():
i = 0
batch_counter = 0
batch = []
while i <= NUM_LINES:
i += 1
recip = {
'address': "test%d@test%d.com" % (i, i)
}
if batch_counter <= BATCH_SIZE:
batch.append(recip)
batch_counter += 1
if (batch_counter == BATCH_SIZE) or i == NUM_LINES:
r.table('recip').insert(batch).run()
batch_counter = 0
batch = []
if __name__ == '__main__':
insert_records()
私の開発環境では、MongoDB スクリプトは 1 秒未満で 20,000 レコードを挿入します。
$ time python mongo_insert_test.py
real 0m0.618s
user 0m0.400s
sys 0m0.032s
同じ環境で、RethinkDB スクリプトの実行は大幅に遅くなり、2 分以上で 20,000 レコードが挿入されます。
$ time python rethink_insert_test.py
real 2m2.502s
user 0m3.000s
sys 0m0.052s
これら 2 つの DBMS がどのように機能するかに関して、ここで大きな何かが欠けていますか? このテストで RethinkDB のパフォーマンスが非常に悪いのはなぜですか?
私の開発マシンには、これらのテストに使用できるメモリが約 1.2GB ありました。