0

私の Ubuntu サーバーには、MongoDB に依存する Ruby on Rails アプリがあります。私はしばしばMongoidを使用して DB にオブジェクトを注入しますが、大量のオブジェクトを注入するときは、ハッシュの巨大な配列をコンパイルし、mongo シェル メソッドdb.collection.insert()で注入します。

ObjectName.collection.insert([{_id: BSON::ObjectId('5671329e4368725951010000'), name: "foo"}, {_id: BSON::ObjectId('567132c94368725951020000'), name: "bar"}])

バッチ挿入時間は私にとってボトルネックです。たとえば、150000 個のオブジェクトをバッチ挿入するには 23 秒かかります。バッチ挿入を高速化する方法でリソースを割り当てることは可能ですか?

4

1 に答える 1

0

mongoid gem を使って試すことができます

batch = [{_id: BSON::ObjectId('5671329e4368725951010000'), name: "foo"}, {_id: BSON::ObjectId('567132c94368725951020000'), name: "bar"}]

Post.collection.insert(batch) #lest Post is the model

または、 Ruby MongoDb Driverで実行できます

require 'mongo'
mongo_client = Mongo::MongoClient.new
coll = mongo_client['test_db']['test_collection']
bulk = coll.initialize_ordered_bulk_op
batch.each do |hash|
  bulk.insert(hash)
end
bulk.execute

同じ方法でmongoクエリでそれが必要な場合。一括挿入をフォローできます

シャーディングを使用してデータを増やすには、

シャーディングは、複数のマシンにまたがってデータ レコードを格納するプロセスであり、データの増大の要求を満たすための MongoDB のアプローチです。データのサイズが大きくなるにつれて、1 台のマシンではデータを格納したり、許容できる読み取りおよび書き込みスループットを提供したりするには不十分な場合があります。シャーディングは、水平スケーリングの問題を解決します。シャーディングを使用すると、マシンを追加して、データの増加と読み取りおよび書き込み操作の要求をサポートできます。

異なるスケーリング

垂直方向のスケーリングでは、CPU とストレージのリソースを追加して容量を増やします。容量を追加することによるスケーリングには限界があります。多数の CPU と大容量の RAM を備えた高性能システムは、小規模なシステムよりも不釣り合いに高価です。さらに、クラウドベースのプロバイダーは、ユーザーが小規模なインスタンスのプロビジョニングのみを許可する場合があります。その結果、垂直スケーリングの実質的な最大能力が得られます。対照的に、シャーディング (水平スケーリング) は、データ セットを分割し、複数のサーバー (シャード) にデータを分散します。各シャードは独立したデータベースであり、集合的に、シャードは単一の論理データベースを構成します。

于 2015-12-16T10:25:11.550 に答える