Java: Советы по работе с большими объемами данных. (Часть Deux) - PullRequest
4 голосов
/ 26 сентября 2008

Хорошо. Поэтому у меня есть очень большое количество двоичных данных (скажем, 10 ГБ), распределенных по группе файлов (скажем, 5000) различной длины.

Я пишу Java-приложение для обработки этих данных и хочу создать хороший дизайн для доступа к данным. Как правило, что произойдет, это:

  • Так или иначе, все данные будут прочитаны в ходе обработки.
  • Каждый файл (обычно) читается последовательно, требуя всего несколько килобайт за раз. Однако часто бывает необходимо иметь, скажем, первые несколько килобайт каждого файла одновременно или несколько средних килобайт каждого файла одновременно и т. Д.
  • Бывают случаи, когда приложению требуется произвольный доступ к байтам или двум здесь и там.

В настоящее время я использую класс RandomAccessFile для чтения в байтовые буферы (и ByteBuffers). Моя конечная цель - заключить доступ к данным в некоторый класс так, чтобы он был быстрым, и мне больше никогда не придется беспокоиться об этом. Основная функциональность заключается в том, что я буду просить его прочитать кадры данных из указанных файлов, и я хочу минимизировать операции ввода-вывода, учитывая приведенные выше соображения.

Примеры типичного доступа:

  • Дайте мне первые 10 килобайт всех моих файлов!
  • Дайте мне байт от 0 до 999 файла F, затем дайте мне байт от 1 до 1000, затем дайте мне от 2 до 1001, и т. Д., И т. Д.,
  • Дайте мне мегабайт данных из файла F, начиная с такого-то байта!

Есть предложения по хорошему дизайну?

Ответы [ 9 ]

9 голосов
/ 26 сентября 2008

Используйте Java NIO и MappedByteBuffers и рассматривайте ваши файлы как список байтовых массивов. Затем позвольте ОС беспокоиться о деталях кэширования, чтения, очистки и т. Д.

2 голосов
/ 26 сентября 2008

@ Будет

Довольно хорошие результаты. Чтение большого двоичного файла быстрого сравнения:

  • Тест 1 - Базовое последовательное чтение с RandomAccessFile. 2656 мс

  • Тест 2 - Базовое последовательное чтение с буферизацией. 47 мс

  • Тест 3 - Базовое последовательное чтение с MappedByteBuffers и дальнейшая оптимизация буферизации кадров. 16 мс

1 голос
/ 27 сентября 2008

Возможно, вы захотите взглянуть на простую объектную базу данных с открытым исходным кодом, которая называется jdbm - она ​​разработала множество подобных вещей, в том числе возможности ACID.

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

Теперь, если ваши файлы данных не находятся под вашим контролем (то есть вы анализируете текстовые файлы, сгенерированные кем-то другим и т. Д.), То тип хранилища с структурированной страницей, который использует jdbm, может не подойти вам - но если все эти файлы являются файлами, которые вы создаете и с которыми работаете, возможно, стоит посмотреть.

1 голос
/ 26 сентября 2008

Я собирался предложить вам продолжить работу Идея базы данных Эрика и узнать, как базы данных управляют своими буферами - эффективное внедрение собственного управления виртуальной памятью.

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

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

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

Кэши файлов операционной системы, с другой стороны, оптимизированы для повторного использования недавно использованных данных (и чтения перед самыми последними использованными данными). Если ваше приложение не соответствует этому шаблону, возможно, стоит самостоятельно управлять кешем.

1 голос
/ 26 сентября 2008

Ничего себе. Вы в основном реализуете базу данных с нуля. Есть ли возможность импортировать данные в реальную СУБД и просто использовать SQL?

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

Конечно, это также влечет за собой много сложной транзакционной логики для обеспечения согласованности ваших данных.

0 голосов
/ 28 сентября 2008

Я бы отступил назад и спросил бы себя, почему вы используете файлы в качестве своей системы записей и какие преимущества дает вам использование базы данных. База данных, безусловно, дает вам возможность структурировать ваши данные. Учитывая стандарт SQL, в долгосрочной перспективе он может быть более удобен в обслуживании.

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

0 голосов
/ 27 сентября 2008

Мне кто-то порекомендовал hadoop (http://hadoop.apache.org) мне только на днях. Похоже, что это может быть довольно мило и может иметь некоторую привлекательность рынка.

0 голосов
/ 26 сентября 2008

Это ответ на вопрос о минимизации трафика ввода-вывода. На стороне Java все, что вы действительно можете сделать, это обернуть свои читатели в BufferedReaders. Кроме того, ваша операционная система будет обрабатывать другие оптимизации, такие как сохранение недавно прочитанных данных в кеше страниц и упреждающее чтение файлов для ускорения последовательного чтения. Нет смысла делать дополнительную буферизацию в Java (хотя вам все еще понадобится байтовый буфер для возврата данных клиенту).

0 голосов
/ 26 сентября 2008

@ Эрик

Но мои запросы будут намного, намного проще, чем все, что я могу сделать с SQL. И разве доступ к базе данных не будет намного дороже, чем чтение двоичных данных?

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