2014-01-15 4 views
0

Я использую Mongodb как кеш прямо сейчас. Приложение будет загружено с 3 CSV за ночь, а CSV увеличатся, потому что новые продукты будут добавляться все время. Прямо сейчас, я достиг 5 миллионов записей, и потребовалось около 2 часов, чтобы обработать все. Поскольку кеш обновляется каждый день, становится нецелесообразным обновлять данные.Производительность Mongodb значительно ухудшается с течением времени с помощью upsert.

Например

CSV 1 
ID, NAME 
1, NAME! 

CSV 2 
ID, DESCRIPTION 
1, DESC 

CSV 3 
ID, SOMETHING_ELSE 
1, SOMETHING_ELSE 

Приложение будет читать CSV 1 и поместить его в базу данных. Затем CSV 2 будет прочитан, если появится новая информация, которую он добавит в тот же документ или создаст новую запись. Та же логика применяется для CSV 3. Таким образом, один документ будет получать разные атрибуты из разных CSV, следовательно, upsert. После того, как все будет сделано, все документы станут индексами.

В настоящее время первые 1 млн. Документов относительно быстры, но я вижу, что со временем производительность значительно ухудшается. Я предполагаю, что это связано с тем, что Mongodb должен найти документ и обновить атрибуты, иначе создав его. Я использую Java Driver и MongoDB 2.4. В любом случае, я могу улучшить или даже выполнить пакетный запуск в java-драйвере mongodb?

ответ

1

Что вы подразумеваете под «после того, как все сделано, тогда все документы будут проиндексированы»? Если это связано с тем, что вы хотите добавить дополнительные индексы, это можно сделать в конце, но это нормально. Если у вас абсолютно нет индексов, то это, скорее всего, ваша проблема.

Вы хотите, чтобы все вставки/upserts, которые вы делаете, используют индекс. Вы можете запустить одну команду и использовать .explain(), чтобы узнать, используется ли индекс соответствующим образом. Вам нужен индекс, иначе вы сканируете 1 миллион документов для каждой вставки/обновления.

Кроме того, можете ли вы также предоставить более подробную информацию о своем приложении?

  1. Вы собираетесь делать импорт в 3 этапа только один раз, или вы будете часто обновлять?
  2. do CSV2 и CSV3 изменить большой процент документов?
  3. внести изменения в CSV2 и CSV3, добавить или заменить документы?
  4. Каков средний размер ваших документов?

Предположим, вы много раз много раз обновляли на тех же документах. Например, CSV2 и CSV3 имеют обновления в тех же документах. Вместо импорта для CSV1, а затем, делая обновления для CSV2, затем еще один набор обновлений для CSV3, вы можете просто сохранить документы в памяти вашего приложения, применить все обновления в памяти, а затем вставить свои документы в базу данных. Это предполагает, что у вас достаточно оперативной памяти для выполнения операции, иначе вы снова будете использовать диск.

Смежные вопросы