Ведение миллиарда пар ключ: значение в файле - PullRequest
0 голосов
/ 03 ноября 2010

Как с помощью Java хранить в файле около миллиарда пар ключ-значение с возможностью динамического обновления и запроса значений при необходимости?

Ответы [ 4 ]

1 голос
/ 18 февраля 2011

Старый вопрос, но это касается файлов журналов. Вы не хотите копировать миллиард записей при каждом удалении. Это может быть решено путем регистрации всех «транзакций» или обновлений нового и отдельного файла. Эти файлы должны быть разбиты на разумные размеры.

Чтобы прочитать кортеж, вы начинаете с самого нового файла журнала, пока не найдете свой ключ, а затем остановитесь. Чтобы обновить или вставить, просто добавьте новую запись в самый последний файл журнала. Удаление по-прежнему является записью в журнале.

Необходимо периодически запускать процесс объединения, который будет сканировать каждый файл журнала и записывать другого мастера. По мере чтения каждый НОВЫЙ ключ записывается в новый мастер, а повторяющиеся (старые) ключи пропускаются до тех пор, пока вы не выполните его полностью. Если вы обнаружили удаляемую запись, отметьте ее в отдельном списке удаления, пропустите эту запись и проигнорируйте последующие записи с этим ключом.

Это показалось вам простым, но помните, что вы можете заблокировать / портировать ваш файл, так как вы, скорее всего, сканируете указанные файлы журнала в обратном порядке, или вы по крайней мере seek() достигнете максимального размера и будете писать в обратном порядке вместо чтения .

Я сделал это точно с миллиардами строк данных. Вы просто заново изобретаете базы данных с последовательным доступом.

1 голос
/ 03 ноября 2010

Если по какой-то причине о базе данных не может быть и речи, вам нужно ответить на следующий вопрос о вашей проблеме:

Какая комбинация следующих операций?

  • Вставка
  • Чтение
  • Изменить
  • Удалить
  • Поиск

Как только вы правильно угадаете соотношение этих операций, попробуйте выбрать подходящую структуру данных для использования в вашем файле. Я бы порекомендовал начать с этой книги как хороший каталог опций:

http://www.amazon.com/Introduction-Algorithms-Second-Thomas-Cormen/dp/0262032937

Вы захотите выбрать структуру данных с наилучшим средним и наихудшим временем выполнения для наиболее распространенных операций.

Удачи

0 голосов
/ 03 ноября 2010

Вы опускаете много деталей, но ...

Клавиши статические? Как насчет ценностей? Они фиксированного размера? Почему бы не использовать базу данных?

Если вы не хотите использовать базу данных, используйте файл с отображением в памяти.

0 голосов
/ 03 ноября 2010

Можете ли вы использовать базу данных? Управление таким большим файлом было бы болезненным.

Редактировать: если требование к файлам в основном состоит в том, чтобы избежать сбоев связи с компьютером, простоев и подобных ситуаций, возможно, вы могли бы использовать встроенную базу данных. Таким образом вы избавитесь от больших проблем с манипулированием файлами и при этом будете использовать все преимущества базы данных. Я уже использовал Apache Derby в качестве встроенной базы данных с прекрасными результатами. Java DB поддерживается Oracle и основывается на Derby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...