powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Эффективная работа с большими файлами (под windows)
17 сообщений из 17, страница 1 из 1
Эффективная работа с большими файлами (под windows)
    #35266803
Dian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла необходимость работать с файлами больших размеров (~20Gb)

Файл представляет собой таблицу небольших записей, каждая новая запись должна быть внесена в строго определенное место. Проблема в том, что записи поступают в таком порядке, что их размещение в файле очень близко к равмномерному распределению. NTFS в такой ситуации работает дико неэффективно - 5000 записей пишутся от 6 до 14 секунд.

Как можно оптимизировать данный процесс?
В конечном итоге файл должен быть именно таким, в случае введения промежуточных этапов в них можно делать что угодно. В распоряжении процесса имеется 32х разрядное адресное простанство и примерно гиг оперативки.
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35267096
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наиболее эффективное решение проблемы - изменить саму архитектуру.
1) Зачем вам писать записи в определенное место - может быть лучше снабдить их номерами.
2) Отсюда сразу следует, что применять надо базу данных, так как там все ваши проблемы решили за вас, причем гарантированно лучше, чем вы когда-нибудь напишете (если конечно не станете год трудиться над этим, да и то...).

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

________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35267352
Фотография Frenzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Как можно оптимизировать данный процесс?

как-то люди задумались над тем же вопросом что мучает сейчас вас. так появились субд
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35267393
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что "расфасовка" записей по номерам имеет цель - индексировать записи по целочисленному ключу. Других мотивов как-бы и не придумаешь.

Я-бы предложил взять какую-нибудь простенькую бесплатную СУБД с упреждающим журналом транзакций типа (Oracle Berkeley) и применить её в данной задаче.
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35267436
Dian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наиболее эффективное решение проблемы - изменить саму архитектуру.
1) Зачем вам писать записи в определенное место - может быть лучше снабдить их номерами.
Боюсь поиск будет неэффективен уже при 2 миллиардах записей. К тому же это дополнительный расход дискового пространства - последнего катастрофически нехватает :(

Отсюда сразу следует, что применять надо базу данных, так как там все ваши проблемы решили за вас, причем гарантированно лучше, чем вы когда-нибудь напишете
Пробовал MSSQL Express. Пишет действительно довольно быстро (bulk insert). Поиск тоже работал довольно шустро (Хотя не факт, что это сохранится на больших объемах данных). Однако, на 5 млн записей база разрослась до 250 метров, при максимально допустимом для них объёме в 100 мегабайт.
Так что задачу там конечно решили хорошо, но в данном случае качество неприемлемо.

Ну если религиозные соображения не позволяют использовать БД, то делаем буффер, сливаем в него новые записи просто по порядку - а фоновый процесс будет их распихивать в большом файле
Примерно такой была самая ранняя реализация. Это, к сожалению, ни коим образом не решает упомянутую проблему.
Религиозные соображения - цель оправдывает средства :)

mayton
всё верно. Не знаю Oracle Berkeley, но справится ли он там, где не хватило MSSQL Express?
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35267470
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DianНе знаю Oracle BerkeleyЭто не совсем сервер БД, в том смысле, в котором все привыкли это понимать. Он только предоставляет необходимый механизм для хранения данных, остальное за программистом. Хранит данные в виде ключ/значение. Посмотреть стоит. Очень вероятно, что подойдет.
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35267974
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно (увы, не могу сказать с точностью, ибо у самого так и не дошли руки поработать), вас может устроить стандартный механизм Windows - "Extensible Storage Engine", ранее известный как "Jet Blue" (это не тот же самый Jet, который является движком Access!).

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

Посмотрите.
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35268202
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dianвсё верно. Не знаю Oracle Berkeley, но справится ли он там, где не хватило MSSQL Express?

Это очень странное заявление. Насколько я знаю, Express ограничен по вычислительной мощности в 1 камень и еще есть какие-то квоты на размер дата-файлов. Пусть спецы меня поправят если ошибся. Но в целом-то СУБД очень хорошая. Есть и partitions. Вы говорите что "не хватило". Не хватило на чём? На inserts? Или на выборках? Что тормозило? В любом случае, я-бы сначала выжал все возможности по перформансу из СУБД а потом уже доделывал велосипед.

P.S. А здесь задавали вопрос?
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35268419
Dian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это очень странное заявление. Насколько я знаю, Express ограничен по вычислительной мощности в 1 камень и еще есть какие-то квоты на размер дата-файлов. Пусть спецы меня поправят если ошибся. Но в целом-то СУБД очень хорошая. Есть и partitions. Вы говорите что "не хватило". Не хватило на чём? На inserts? Или на выборках? Что тормозило? В любом случае, я-бы сначала выжал все возможности по перформансу из СУБД а потом уже доделывал велосипед.
Уж Standard Edition то под это могут купить. См выше - проблема не в перформансе, а в эффективности использования дискового простанства. Если использовать MS только для индекса, велосипеды остаются на месте. Если использовать его для всех данных, увеличение в 2.5 раза скушает на диске лишние ~6Тб.
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35268558
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть желание попрограммировать, то можно попробовать хранить данные в виде BPlusTree . Даёт приличный перформанс, при этом на индексы тратится мало места.
Кстати, есть бесплатные обьектные базы данных, которые работают на этом принципе, можно попробовать их заюзать
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35268582
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatmanЕсли есть желание попрограммировать, то можно попробовать хранить данные в виде BPlusTree
Все СУБД (и Berkeley в т.ч) стоят на 3 китах: B+Tree, Hashtables, LRU-list. Они могут использоватся явно или скрытно, могут иметь различные модификации но суть от этого не меняется.
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35268599
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton[quot Gatman]
Все СУБД (и Berkeley в т.ч) стоят на 3 китах: B+Tree, Hashtables, LRU-list.
Утверждать точно не могу, но в книжке по MS SQL 2005 Пирогова читал что индексы там строятся на BTree, а не B+Tree
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35268614
Dian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что в моей системе кит другой - индексирование идет так, что требуемый объем уменьшается
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35269654
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если данные не хитроспецифические (каков кстати у вас размер одной записи?), то индексирование всегда требует лишего места и лишнего времени на добавление, но экономит его при поиске.
Сесть на оба стула нельзя:
1) Может быть вам пожертвовать при таких объемах лишними гигабайтами, они дешево стоят. И тогда использовать готовую СУБД.
2) В принципе как-то переформулировать задачу - она достаточно специфическая вероятно и можно попробовать кардинально переиграть метод.
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35269715
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DianNTFS в такой ситуации работает дико неэффективно - 5000 записей пишутся от 6 до 14 секунд.Имхо, файловая система не виновата (даже неважно, NTFS это или нет).
Сами представьте, что вы от нее просите - спозиционировать головки диска, прочитать блок (кластер в терминологии FAT) данных, изменить его, спозиционировать головки диска (если их кто-то успел увести), записать обратно. И так непрерывно. Т.е. у вас основной упор не в ФС, а в диски.

Насколько оперативно все это должно работать? Т.е от момента прихода данных, до окончательного их расположения в файле?
Каковы требования/допуски по потерям данных?
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35270032
Dian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelikk
Сейчас как раз прорабатываю второй вариант. Здесь дело идет на террабайты, а они, увы, дороже.

miksoft
Всё верно, это и понималось под "процессом" в первом посте. Пока наиболее адекватное предложение, которое я услышал - сортировать блоки входных данные по их разположению и отправлять на запись по порядку (в идеале - блоками соседних записей)

Потери данных недопустимы, что ж касается скорости/объйма - это направления, чем быстрее/компактнее - тем лучше
...
Рейтинг: 0 / 0
Эффективная работа с большими файлами (под windows)
    #35271133
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DianДело в том, что в моей системе кит другой - индексирование идет так, что требуемый объем уменьшается

Ага. Это называется compressed index.

DianПока наиболее адекватное предложение, которое я услышал - сортировать блоки входных данные по их разположению и отправлять на запись по порядку (в идеале - блоками соседних записей)


Верно. Любая СУБД с упреждающим журналом транзакций это делает автоматически.

Еще можно собрать диск в RAID0 c величиной stripe кратной размеру вашего блока. Технически, должно увеличить скорость seeking.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Эффективная работа с большими файлами (под windows)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]