|
|
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Привет всем. Решаю такую задачу- есть файл с бинарными данными регулярной повторяющейся структурой: Например, struct { int f1; float f2; int f3; } Мне нужно обеспечить такие операции над этими данными: - постраничная выборка подмножеств структур, отсортированных по некоторому полю, например f1 (аналог ORDER BY и LIMIT) - поиск и сортировка. Для этих целей у меня возникло два варианта решения: 1) написать Reader для структур и перегнать их в БД и затем использовать этот вариант оказался очень медленным для очень больших файлов (1...5Гб). Пробовал на MySQL, Postgres. Поэтому возникла мысль о втором варианте: 2) написать свой аналог специализированной БД, заточенной только под конкретные задачи. Тем более задачи подразумевают лишь чтение данных, а не их изменение. Мне нужно прежде всего быстродействие, поэтому начав исследовать этот вариант, я подумал, что нужно проиндексировать все поля структуры, тоесть построить для каждого поля f(i) упорядоченный индекс. Таким образом можно решить задачу постраничной выборки с сортировкой. Для построения индексов я выбрал алгоритм двухфазной сортировки слиянием. Что у меня получилось: первая фаза (когда строятся первые отсортированные списки (размером 16Кб) выполняется довольно быстро: 300 секунд на проце Core2Duo 2Gb оперативки. Пока вторую фазу (слияние подсписков) я еще реализую и там возникает множество сомнений. Но посему вопрос - в правильном ли я направлении двигаюсь? Может есть более эффективный алгоритм? Что можно посоветовать в подобных случаях? спасибо за внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 17:09 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
да, забыл уточнить, я пользуюсь алгоритмом сортировки двухфазным многокомпонентным слиянием для сверхбольших отношений, описанный в книге "Системы баз данных", Г.Гарсиа-Молина, Дж. Ульман и др. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 17:18 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
unicornmirage wrote: > да, забыл уточнить, я пользуюсь алгоритмом сортировки двухфазным > многокомпонентным слиянием для сверхбольших отношений, описанный в книге > "Системы баз данных", Г.Гарсиа-Молина, Дж. Ульман и др. Ну это хорошо, что ты такую хорошую книгу читаешь, и в нужном месте. Но вот почему у тебя не получилось с БД -- я не понял. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 18:04 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
С MySQL, говорите, пробовали? И что же, Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 21:02 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Ennor TiegaelС MySQL, говорите, пробовали? И что же, Код: plaintext нет, так не пробовал. Действовал в лоб - парсил файл и загонял по кортежу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 21:29 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Ennor Tiegael Код: plaintext За эту команду, кстати спасибо! Попробую поэкспериментировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 21:45 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Может вам подумать про Map-Reduce движок? авторHadoop Sorts a Petabyte in 16.25 Hours and a Terabyte in 62 Seconds and has its green cred questioned because it took 40 times the number of machines Greenplum used to do the same work. http://highscalability.com/product-hadoop ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2009, 10:28 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2009, 10:03 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Ну или коммерческий извод БД в оперативке - TimesTen. 5 Гб данных влезет в 16 Гб оперативки, даже с индексами. 16 Гб в сервере сейчас не редкость. Причем, сей подход не исключает оптимизации, о которой написано выше. Это можно и нужно сочетать, получится еще быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2009, 10:16 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
unicornmirage 1) написать Reader для структур и перегнать их в БД и затем использовать этот вариант оказался очень медленным для очень больших файлов (1...5Гб). Пробовал на MySQL, Postgres. .... Но посему вопрос - в правильном ли я направлении двигаюсь? Увы нет, правильным направлением это назвать нельзя. От самописки ты абсолютно ничего не выиграешь. Лучше бы это время потратил на поиск узкого места и оптимизацию БД. Может быть, что перед заливкой такого большего объема данных просто забыл отключить индексы. Тогда ничего удивительного нет в наличии тормозов ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2009, 22:56 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Реалист Может быть, что перед заливкой такого большего объема данных просто забыл отключить индексы. Тогда ничего удивительного нет в наличии тормозов ;-) Дело в том, что индексы полюбому потом всё равно будут нужны, так как эти данные будут потом активно анализироваться, сортироваться по разным полям, осуществляться поиск по любому из полей или объединяться с другими подобными данными. И как раз одно из требований - обеспечить максимальную производительность анализа. Поэтому да, я индексирование не отключал при загрузке данных в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 12:15 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Реалист Лучше бы это время потратил на поиск узкого места и оптимизацию БД. Для заливки данных я использую простую таблицу для каждого файла с индексацией всех полей. Таблицы не имеют внешних ключей и являются сами по себе. Как можно в данном случае оптимизировать процесс заливки большого количества данных? 5 Гигов - это всего лишь отдельно взятый файл, коих может быть несколько десятков. Ждать, пока все эти данные перегонятся в БД только затем, чтобы потом их анализировать в режиме только для чтения - это занимает слишком много времени. Поэтому встал вопрос - написать простенький аналог СУБД для этой конкретной задачи. Тем более структура файлов тривиальная. Нужно лишь решить задачу индексации полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 12:20 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
unicornmirageРеалист Может быть, что перед заливкой такого большего объема данных просто забыл отключить индексы. Тогда ничего удивительного нет в наличии тормозов ;-) Дело в том, что индексы полюбому потом всё равно будут нужны, так как эти данные будут потом активно анализироваться, сортироваться по разным полям, осуществляться поиск по любому из полей или объединяться с другими подобными данными. И как раз одно из требований - обеспечить максимальную производительность анализа. Поэтому да, я индексирование не отключал при загрузке данных в БД. Загрузка данных в БД и работа БД - разные задачи, которые можно разнести по времени. Загрузка большого объема данных при включенных индексах, очень тормозит БД т.к. индексы пересчитываются каждый раз при добавлении новой порции данных . Обычно, загрузка такого большого объема данных происходит при выключенных индексах, которые пересчитываются один раз , уже после того, как данные загружены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 12:24 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Что я сейчас начал делать: 1) пусть есть у нас большой файл с однородной повторяющейся структурой {f1, f2, f3,...,fn} . 2) решено расщепить этот файл на несколько файлов, соответственно каждый файл с именем f(i).dat будет содержать пару: {f(i), position} где f(i) - это поле из исходного файла, а position - указатель на структуру в исходном файле, содержащую это поле. Соответственно в файле f(i).dat все поля f(i) отсортированы в возрастающем порядке. Это позволит выполнять постраничные запросы с сортировкой по любому из полей (аналог LIMIT + ORDER BY) Тоесть задача алгоритмически и концептуально уже решена. Остался вопрос с оптимизацией узкого места в этой задаче- сортировка файла f(i).dat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 12:28 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Реалист Загрузка данных в БД и работа БД - разные задачи, которые можно разнести по времени. К сожалению, разнести во времени это нельзя. Так как анализ данных необходимо вести оперативно, по мере поступления исходных файлов большого объема. Это одно из требований ТЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 12:31 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
unicornmirage, "Я напишу лучше" ;-)))) Вы придете к созданию собственной БД, потратив на это море сил и времени, но значительного прироста быстродействия так и не получите. Лучше бы Вы разобрались где у Вас узкое место при работе с БД и устранили именно его, вместо переписывания кода всей базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 12:49 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Реалист, ну лучше может не напишу конечно же. но попытаться стоит :) а вот где узкое место в БД - так я уже сказал - это заливка данных. Ладно, попробую с отключенными индексами попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 12:56 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Я ведь грешным делом подумал, что у тебя задача: unicornmirage - постраничная выборка подмножеств структур, отсортированных по некоторому полю, например f1 (аналог ORDER BY и LIMIT) - поиск и сортировка Тут не написано "переписать базу данных" ;-) unicornmirageЛадно, попробую с отключенными индексами попробовать. Если не трудно, отпиши, что получилось ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 14:13 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
unicornmirage wrote: > Дело в том, что индексы полюбому потом всё равно будут нужны, так как > эти данные будут потом активно анализироваться, сортироваться по разным Вы ничего не поняли. Делается это так. Создаётся база, с индексами. Перед загрузкой индексы дропаются или дизейблятся, в зависимости от возможностей СУБД. Данные заливаются, без транзакций и индексов, поэтому - БЫСТРО. Как -- в зависимости от возможностей СУБД, обычно это -- отдельные возможности загрузки данных, не используемые в OLTP. Затем индексы создаются, и на БД пускаются обычные OLTP - запросы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 14:40 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
MasterZiv, спасибо, уже понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 14:47 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
unicornmirage, Занимаюсь подобными системами (самые крупные 1600 float(ов) 2500 bool(ов) с дискретностью записи 1 сек) делал как с файловым хранилищем, так и с базой данных (Firebird). Если есть желание пообщаться пишите в личку, поделимся опытом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 20:19 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Виталич Да, А остальные???? Я бы тоже с удовольствием почитал обмен опытом, тем более, что сам на птичке делал некоторые проекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2009, 21:48 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Реалист, Просто на все вопросы в общем уже ответили, да так, что добавить не чего, а по MySQL и Postgres я ни чего добавить не смогу, так как с ними не работал. А по общаться с человеком, который занимается подобными система интересно. Если есть вопросы создовайте топик попробуем пообщаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2009, 11:58 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2009, 12:01 |
|
||
|
Сортировка большого файла (в среднем 5 Гб)
|
|||
|---|---|---|---|
|
#18+
Senya_Lunicornmirage, Возможно, Вам интересно будет почитать описание сортировки в реальных СУБД. Тынц . Очень интересно, спасибо, уже читаю! Несмотря на то, что всегда остается вариант использовать существующие СУБД, решено попробовать пойти по пути создания специализированной СУБД. (Время на это имеется, так что экономические факторы этого пути не рассматриваю :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2009, 13:07 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=87&tid=1543211]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 396ms |

| 0 / 0 |
