Библиотека / структура данных для обработки больших данных

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

Каждая запись в журнале имеет несколько атрибутов, таких как отметка времени, тип, сообщение, некоторые идентификаторы GUID. Записи являются однородными, никаких отношений, нет необходимости хранить данные после «проверки».

Я действительно не знаю, как обращаться с таким большим количеством данных. Хранить все в памяти было бы глупо, то же самое относится и к хранению данных в плоском файле. Я думал об использовании небольших СУБД, таких как SQLite, но я не уверен, что это будет достаточно быстро, и мне не нужны многие функции DMBS - только сортировка и поиск. В этом случае я бы с готовностью променял место на скорость, если это возможно.

Существует ли какая-либо библиотека (или, возможно, структура данных), которая помогла бы мне обрабатывать такие объемы данных?

«Обслуживаемые» РСУБД, такие как Postgre, MSSQL, MySQL, не обсуждаются, О, и кто-нибудь знает, имеет ли режим SQLite ": memory" какие-либо ограничения по размеру БД, или он будет просто заполнять виртуальную память, пока не заполнится полностью?

14
задан kurczak 10 August 2010 в 20:38
поделиться

8 ответов

Ознакомьтесь с STXXL - стандартной библиотекой шаблонов для очень больших наборов данных.

«Ядро STXXL - это реализация стандартной библиотеки шаблонов C ++ STL для вычислений с внешней памятью (вне ядра), то есть STXXL реализует контейнеры и алгоритмы, которые могут обрабатывать огромные объемы данных, которые помещаются только на диски. Хотя совместимость с STL обеспечивает простоту использования и совместимость с существующими приложениями, другим приоритетом проектирования является высокая производительность »

. Также, если вы можете выделить несколько компьютеров для этой задачи, проверьте Hadoop . Особенно HBase, Hive и MapReduce.

12
ответ дан 1 December 2019 в 08:51
поделиться

Я думаю, что сохранение этого в СУБД является подходящим подходом. Сортировка и поиск - это задачи, которые DB отлично выполняет, и с таким большим объемом данных использование инструмента, разработанного для этой цели, будет огромным преимуществом.

Для этого хорошо подойдет SQLite, хотя нереляционное хранилище данных может использовать меньше места. Однако, если вы хотите искать по нескольким «записям», вам определенно подойдет БД.

6
ответ дан 1 December 2019 в 08:51
поделиться

Как насчет того, чтобы использовать какой-нибудь ввод-вывод с отображением памяти, что-то вроде Java MappedByteBuffer и использовать собственный инструмент?

Перефразируя ответ SO на MBB ,

По сути, этот механизм использует систему подкачки виртуальной памяти ОС для «сопоставления» ваших файлов и программного представления их в виде байтовых буферов. ОС будет управлять перемещением байтов на диск и в память автоматически и очень быстро.

Было бы разумно создать такие файлы для каждого из ваших файлов журналов, чтобы читать их. Предостережение: вы должны быть на 64-битной версии, поскольку это дает вашим файлам ограничение в ТБ, а не в ГБ.

Просмотр, фильтрация и сортировка Простое отображение файлов в некоторой иерархии и использование такой метрики, как имя файла или отметка времени для их сортировки, должно быть простым с вашим собственным кодом, когда вы имеете дело с MBB. Каковы ваши критерии фильтрации?

Поиск Теперь, если вы хотите выполнить поиск по ним - Lucene, работающий поверх этого, предоставит вам хороший метод для индексации файлов. Это тоже можно сделать разными способами - используйте hadoop и Map / Reduce, как уже упоминалось другими, для распределения задач по нескольким машинам.

Советы по производительности на этом сайте великолепны.

3
ответ дан 1 December 2019 в 08:51
поделиться

Формат файла HDF5 и соответствующая библиотека предназначены для хранения больших объемов данных и обеспечения быстрого и эффективного ввода-вывода по ним.

Проект pytables предоставляет удобный способ их использования из Python и предоставляет методы для сортировки и поиска.

5
ответ дан 1 December 2019 в 08:51
поделиться

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

Альтернативой является использование коммерческих инструментов, таких как Splunk .

2
ответ дан 1 December 2019 в 08:51
поделиться

Анализатор журнала. Предлагаю вам взглянуть на парсер логов msft. Он включен в комплект ресурсов iis и предоставляет многое из того, что вы ищете. Возможно, наиболее полезной функцией является возможность выполнять SQL-подобные запросы к плоскому файлу. Это можно делать даже в файлах.

2
ответ дан 1 December 2019 в 08:51
поделиться

Одним из вариантов может быть Berkeley DB, или какой-нибудь похожий встраиваемый менеджер баз данных.

Я не использовал Berkely DB, но из беглого просмотра я предполагаю, что он похож на многие менеджеры баз данных ISAM, которые были много лет назад - в основном это библиотека для работы со структурами данных ключ->индекс данных на диске. Единственное предостережение - я видел упоминание о хэш-таблицах, так что она может не делать последовательную часть ISAM, но я ожидаю, что она делает это - в последней версии даже есть поддержка SQL.

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

Если это что-то вроде Btrieve (который я использовал много лет назад в течение некоторого времени), это должно быть достаточно просто.

1
ответ дан 1 December 2019 в 08:51
поделиться

"метка времени, тип, сообщение, некоторые GUID. Записи однородны, нет связей, нет необходимости хранить данные после их "осмотра"."

Вы не думали о том, чтобы просто хранить дискретные записи как отдельные файлы в каталоге?

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

И лучше всего то, что api встроен в ОС.

..

Очевидно, если вам нужно что-то более гибкое, чем это, то вам понадобится соответствующая БД, но это может сработать в зависимости от ваших требований.

0
ответ дан 1 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: