Стратегии записи расширяемых упорядоченных файлов на диск

Я аспирант кафедры ядерной физики, сейчас работаю над программой анализа данных. Данные состоят из миллиардов многомерных точек.

В любом случае я использую кривые заполнения пространства для сопоставления нескольких измерений с одним измерением, и я использую дерево B + для индексации страниц данных. Каждая страница будет иметь постоянное максимальное количество точек внутри.

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

Основываясь на комментариях, позвольте мне немного уменьшить это.

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

Если это вообще имеет смысл, я был бы признателен за любые решения этой проблемы, которые могут у вас быть.

Изменить:
Данные представляют собой точки в многомерных пространствах. По сути списки целых чисел. Каждое из этих целых чисел составляет 2 байта, но с каждым целым числом также связаны дополнительные 2 байта метаданных. Итак, 4 байта на координату и от 3 до 20 координат. Таким образом, по сути, данные состоят из миллиардов фрагментов, каждый фрагмент находится между 12 и 100 байтами. (очевидно, что точки с четырьмя измерениями будут расположены в другом файле, чем точки с пятью измерениями после их извлечения).

Я использую методы, аналогичные описанным в этой статье: http://www.ddj.com/184410998

Изменить 2: я немного сожалею, что задаю этот вопрос здесь, поэтому считаю его официально отмененным; но вот причина, по которой я не использую готовые продукты. Мои данные - это точки, которые варьируются от 3 до 22 измерений. Если вы думаете о каждой точке как о простом списке, вы можете представить себе, как я хочу запрашивать точки, как все числа, которые появились в тех же списках, что и эти числа. Ниже приведены некоторые примеры с низкой размерностью (и намного меньшим количеством точек данных, чем обычно) Пример: данные 237, 661, 511, 1021 1047, 661, 237 511, 237, 1021 511, 661, 1047, 1021

Queries:
511
1021
237, 661
1021, 1047
511, 237, 1047

Responses:
237, 661, 1021, 237, 1021, 661, 1047, 1021
237, 661, 511, 511, 237, 511, 661, 1047
511, 1021, 1047
511, 661
_

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

Но проблема усложняется. Не все координаты одинаковы. Часто мы просто работаем с гамма-сферой отдельно, и поэтому каждая координата представляет энергию гамма-излучения. Но в других случаях мы вставляем нейтронные детекторы в гамма-сферу или детекторную систему, называемую микрошаром, или иногда нуклиды, образующиеся в гамма-сфере, направляются в масс-анализатор фрагментов, все эти и другие детекторные системы могут использоваться по отдельности или в любой комбинации с гамма-сферой. К сожалению, мы почти всегда хотим иметь возможность выбирать эти дополнительные данные способом, аналогичным описанному выше. Итак, теперь координаты могут иметь разное значение: если у одного есть просто микрошарик в дополнение к гамма-сфере, вы создаете n-мерное событие таким количеством способов, как есть положительные решения уравнения x + y = n. Кроме того, с каждой координатой связаны метаданные. таким образом, каждое из чисел, которые я показал, будет иметь по крайней мере два дополнительных числа, связанных с ними: первое, номер детектора, для детектора, зафиксировавшего событие, второе, значение эффективности, чтобы описать, сколько раз это конкретное гамма-излучение учитывается (поскольку процент гамма-лучей, попадающих в детектор, которые фактически обнаруживаются, варьируется в зависимости от детектора и энергии).

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


person James Matta    schedule 28.07.2009    source источник
comment
Не могли бы вы объяснить свое утверждение, чтобы ни одна из стандартных вещей, таких как SQL, действительно не работала? Это то, что делают покрывающие индексы ... SQL Server 2008 должен справиться с этим, как и другие СУБД.   -  person Mitch Wheat    schedule 28.07.2009
comment
Расположены ли данные в ваших файлах в том порядке, в котором они должны быть созданы?   -  person jn29098    schedule 28.07.2009
comment
Можете ли вы рассказать о формате вашего файла?   -  person jn29098    schedule 28.07.2009
comment
Как выглядит форма ваших данных? т.е. у вас есть миллионы вещей по 10 гигов или у вас есть триллионы записей, каждая из которых состоит из нескольких байтов?   -  person Peter Recore    schedule 28.07.2009
comment
Еще одна причина, по которой я не хочу использовать готовые продукты, заключается в том, что у моих данных есть особые потребности. Мне нужно сохранить метаданные, связанные с координатой С этой координатой. Поскольку порядок «координат» не имеет значения, пространство будет заполнено неравномерно (потому что я буду сортировать координаты.   -  person James Matta    schedule 28.07.2009


Ответы (3)


Я считаю, что вам следует сначала посмотреть, что могут предложить коммерческие и бесплатные базы данных. Они предназначены для выполнения быстрого поиска по диапазону (с учетом правильных индексов) и эффективного управления памятью и чтения / записи страниц на диск.

В противном случае взгляните на один из вариантов двоичного Space Partition (BSP) деревья.

person Mitch Wheat    schedule 28.07.2009

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

Я собирался изначально предложить вам использовать Lucene ... но если подумать, это действительно похоже на то, что вы должны обработать с помощью Hadoop. Он был создан для такого рода работы (при условии, что у вас есть для этого инфраструктура).

Я бы точно не стал делать это в базе данных.

Когда вы говорите об индексировании данных и заполнении документов точками данных ... и у вас нет инфраструктуры, ноу-хау или времени для реализации hadoop, вам следует вернуться к моей исходной мысли и использовать Lucene. Фактически вы можете индексировать свои данные таким образом и хранить свои точки данных непосредственно в индексе (по числовому диапазону, я бы подумал) со структурой «документ» (объект), как вы думаете.

person Andrew Siemer    schedule 28.07.2009
comment
! Я бы определенно не стал делать это в базе данных - это так неправильно! Базы данных разработаны с нуля, чтобы быть эффективными при поиске и подкачке памяти. - person Mitch Wheat; 28.07.2009
comment
Ключевым моментом здесь является то, что вы обрабатываете свой первоначальный набор данных? Когда вы переходите к битам данных, которые хотите сохранить в свой индекс, вы записываете их в свой индекс Lucene и отбрасываете эти данные (теперь из памяти). Но он записывается локально, а не по сети, и очень быстро индексируется на лету, что делает его очень быстрым, когда вам нужно добавить что-то еще в этот набор ... или когда вам нужно разделить документ. Нет работы с данными в памяти ... но также и без подключения и записи в базу данных каждые несколько миллисекунд! - person Andrew Siemer; 28.07.2009

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

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

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

person James Matta    schedule 11.09.2009