|
|
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Возникла необходимость работать с файлами больших размеров (~20Gb) Файл представляет собой таблицу небольших записей, каждая новая запись должна быть внесена в строго определенное место. Проблема в том, что записи поступают в таком порядке, что их размещение в файле очень близко к равмномерному распределению. NTFS в такой ситуации работает дико неэффективно - 5000 записей пишутся от 6 до 14 секунд. Как можно оптимизировать данный процесс? В конечном итоге файл должен быть именно таким, в случае введения промежуточных этапов в них можно делать что угодно. В распоряжении процесса имеется 32х разрядное адресное простанство и примерно гиг оперативки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2008, 12:17 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Наиболее эффективное решение проблемы - изменить саму архитектуру. 1) Зачем вам писать записи в определенное место - может быть лучше снабдить их номерами. 2) Отсюда сразу следует, что применять надо базу данных, так как там все ваши проблемы решили за вас, причем гарантированно лучше, чем вы когда-нибудь напишете (если конечно не станете год трудиться над этим, да и то...). 3) Ну если религиозные соображения не позволяют использовать БД, то делаем буффер, сливаем в него новые записи просто по порядку - а фоновый процесс будет их распихивать в большом файле - но это все равно жутко криво и просто примитивнейшая копия работы менеджера кеша БД. ________________________________________________________ Глюк - это высокоорганизованная система не поддающихся определению частиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2008, 17:57 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
> Как можно оптимизировать данный процесс? как-то люди задумались над тем же вопросом что мучает сейчас вас. так появились субд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2008, 23:45 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, что "расфасовка" записей по номерам имеет цель - индексировать записи по целочисленному ключу. Других мотивов как-бы и не придумаешь. Я-бы предложил взять какую-нибудь простенькую бесплатную СУБД с упреждающим журналом транзакций типа (Oracle Berkeley) и применить её в данной задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 00:35 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Наиболее эффективное решение проблемы - изменить саму архитектуру. 1) Зачем вам писать записи в определенное место - может быть лучше снабдить их номерами. Боюсь поиск будет неэффективен уже при 2 миллиардах записей. К тому же это дополнительный расход дискового пространства - последнего катастрофически нехватает :( Отсюда сразу следует, что применять надо базу данных, так как там все ваши проблемы решили за вас, причем гарантированно лучше, чем вы когда-нибудь напишете Пробовал MSSQL Express. Пишет действительно довольно быстро (bulk insert). Поиск тоже работал довольно шустро (Хотя не факт, что это сохранится на больших объемах данных). Однако, на 5 млн записей база разрослась до 250 метров, при максимально допустимом для них объёме в 100 мегабайт. Так что задачу там конечно решили хорошо, но в данном случае качество неприемлемо. Ну если религиозные соображения не позволяют использовать БД, то делаем буффер, сливаем в него новые записи просто по порядку - а фоновый процесс будет их распихивать в большом файле Примерно такой была самая ранняя реализация. Это, к сожалению, ни коим образом не решает упомянутую проблему. Религиозные соображения - цель оправдывает средства :) mayton всё верно. Не знаю Oracle Berkeley, но справится ли он там, где не хватило MSSQL Express? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 03:22 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
DianНе знаю Oracle BerkeleyЭто не совсем сервер БД, в том смысле, в котором все привыкли это понимать. Он только предоставляет необходимый механизм для хранения данных, остальное за программистом. Хранит данные в виде ключ/значение. Посмотреть стоит. Очень вероятно, что подойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 06:14 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Возможно (увы, не могу сказать с точностью, ибо у самого так и не дошли руки поработать), вас может устроить стандартный механизм Windows - "Extensible Storage Engine", ранее известный как "Jet Blue" (это не тот же самый Jet, который является движком Access!). Из документации я для себя понял, что это реализация индексно-последовательных файлов, с некоторыми дополнительными "вкусностями" (типа поддержки транзакций). Посмотрите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 11:48 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Dianвсё верно. Не знаю Oracle Berkeley, но справится ли он там, где не хватило MSSQL Express? Это очень странное заявление. Насколько я знаю, Express ограничен по вычислительной мощности в 1 камень и еще есть какие-то квоты на размер дата-файлов. Пусть спецы меня поправят если ошибся. Но в целом-то СУБД очень хорошая. Есть и partitions. Вы говорите что "не хватило". Не хватило на чём? На inserts? Или на выборках? Что тормозило? В любом случае, я-бы сначала выжал все возможности по перформансу из СУБД а потом уже доделывал велосипед. P.S. А здесь задавали вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 12:56 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Это очень странное заявление. Насколько я знаю, Express ограничен по вычислительной мощности в 1 камень и еще есть какие-то квоты на размер дата-файлов. Пусть спецы меня поправят если ошибся. Но в целом-то СУБД очень хорошая. Есть и partitions. Вы говорите что "не хватило". Не хватило на чём? На inserts? Или на выборках? Что тормозило? В любом случае, я-бы сначала выжал все возможности по перформансу из СУБД а потом уже доделывал велосипед. Уж Standard Edition то под это могут купить. См выше - проблема не в перформансе, а в эффективности использования дискового простанства. Если использовать MS только для индекса, велосипеды остаются на месте. Если использовать его для всех данных, увеличение в 2.5 раза скушает на диске лишние ~6Тб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 14:10 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Если есть желание попрограммировать, то можно попробовать хранить данные в виде BPlusTree . Даёт приличный перформанс, при этом на индексы тратится мало места. Кстати, есть бесплатные обьектные базы данных, которые работают на этом принципе, можно попробовать их заюзать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 14:45 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
GatmanЕсли есть желание попрограммировать, то можно попробовать хранить данные в виде BPlusTree Все СУБД (и Berkeley в т.ч) стоят на 3 китах: B+Tree, Hashtables, LRU-list. Они могут использоватся явно или скрытно, могут иметь различные модификации но суть от этого не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 14:51 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
mayton[quot Gatman] Все СУБД (и Berkeley в т.ч) стоят на 3 китах: B+Tree, Hashtables, LRU-list. Утверждать точно не могу, но в книжке по MS SQL 2005 Пирогова читал что индексы там строятся на BTree, а не B+Tree ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 14:54 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Дело в том, что в моей системе кит другой - индексирование идет так, что требуемый объем уменьшается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 14:58 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Если данные не хитроспецифические (каков кстати у вас размер одной записи?), то индексирование всегда требует лишего места и лишнего времени на добавление, но экономит его при поиске. Сесть на оба стула нельзя: 1) Может быть вам пожертвовать при таких объемах лишними гигабайтами, они дешево стоят. И тогда использовать готовую СУБД. 2) В принципе как-то переформулировать задачу - она достаточно специфическая вероятно и можно попробовать кардинально переиграть метод. ________________________________________________________ Глюк - это высокоорганизованная система не поддающихся определению частиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 19:17 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
DianNTFS в такой ситуации работает дико неэффективно - 5000 записей пишутся от 6 до 14 секунд.Имхо, файловая система не виновата (даже неважно, NTFS это или нет). Сами представьте, что вы от нее просите - спозиционировать головки диска, прочитать блок (кластер в терминологии FAT) данных, изменить его, спозиционировать головки диска (если их кто-то успел увести), записать обратно. И так непрерывно. Т.е. у вас основной упор не в ФС, а в диски. Насколько оперативно все это должно работать? Т.е от момента прихода данных, до окончательного их расположения в файле? Каковы требования/допуски по потерям данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 20:04 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
Lelikk Сейчас как раз прорабатываю второй вариант. Здесь дело идет на террабайты, а они, увы, дороже. miksoft Всё верно, это и понималось под "процессом" в первом посте. Пока наиболее адекватное предложение, которое я услышал - сортировать блоки входных данные по их разположению и отправлять на запись по порядку (в идеале - блоками соседних записей) Потери данных недопустимы, что ж касается скорости/объйма - это направления, чем быстрее/компактнее - тем лучше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 02:25 |
|
||
|
Эффективная работа с большими файлами (под windows)
|
|||
|---|---|---|---|
|
#18+
DianДело в том, что в моей системе кит другой - индексирование идет так, что требуемый объем уменьшается Ага. Это называется compressed index. DianПока наиболее адекватное предложение, которое я услышал - сортировать блоки входных данные по их разположению и отправлять на запись по порядку (в идеале - блоками соседних записей) Верно. Любая СУБД с упреждающим журналом транзакций это делает автоматически. Еще можно собрать диск в RAID0 c величиной stripe кратной размеру вашего блока. Технически, должно увеличить скорость seeking. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:24 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35269654&tid=1345343]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 375ms |

| 0 / 0 |
