Оптимизация чтения файлов с HD - PullRequest
1 голос
/ 01 февраля 2011

У меня есть следующий цикл:

for fileName in fileList:
    f = open(fileName)
    txt = open(f).read()
    analyze(txt)

fileList - это список из более чем 1 миллиона маленьких файлов.Опытным путем я обнаружил, что вызов open(fileName) занимает более 90% времени выполнения цикла.Что бы вы сделали, чтобы оптимизировать этот цикл.Это вопрос «только программного обеспечения», покупка нового оборудования невозможна .

Некоторая информация об этом наборе файлов:

Каждое имя файла содержит 9-13-значный идентификатор.Файлы расположены в подпапках в соответствии с первыми 4 цифрами идентификатора.Файлы хранятся на NTFS-диске, и я, скорее, не изменяю формат диска по причинам, о которых я не буду рассказывать, если только у кого-то здесь нет твердого убеждения, что такое изменение будет иметь огромное значение.

Решение

Спасибо всем за ответы.

Моим решением было передать все файлы, проанализировать их и поместить результаты в базу данных SQLite.Никакой анализ, который я выполняю на данных (выберите несколько записей, сделайте математику), займет всего несколько секундУже было сказано, что чтение занимает около 90% времени, поэтому предварительный анализ XML-файлов мало влияет на производительность по сравнению с отсутствием необходимости читать реальные файлы с диска.

Ответы [ 5 ]

2 голосов
/ 01 февраля 2011

Аппаратное решение

Вам действительно стоит воспользоваться твердотельным накопителем (SSD). Они намного быстрее, чем традиционные жесткие диски, потому что в них нет аппаратных компонентов, которые нужно вращать и перемещать.

Программное решение

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

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

1 голос
/ 01 февраля 2011

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

0 голосов
/ 01 февраля 2011

Храните файлы в одном архиве .zip и читайте их из него. Вы просто читаете эти файлы, верно?

0 голосов
/ 01 февраля 2011

Итак, давайте прямо скажем: у вас есть надежные эмпирические данные, которые показывают, что вашим узким местом является файловая система, но вы не хотите менять свою файловую структуру? Посмотрите на закон Амдаля. Если открытие файлов занимает 90% времени, то без изменения этой части программы вы не сможете ускорить процесс более чем на 10%.

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

Поскольку то, что у вас здесь есть, по сути, большая хеш-таблица, вы должны хранить ее в формате файла, который больше подходит для такого рода использования. В зависимости от того, нужно ли вам изменять эти файлы и будет ли набор данных помещаться в ОЗУ, вам следует использовать полнофункциональную базу данных, легковесную встраиваемую базу данных, такую ​​как sqlite, формат сериализации хэш-таблицы / словаря вашего языка, 1005 * архив или программа хранения значений ключей, которая имеет хорошую поддержку постоянства.

0 голосов
/ 01 февраля 2011

Чтобы обратиться к вашему последнему пункту:

, если кто-то здесь не твердо убежден, что такое изменение будет иметь огромное значение

Если мы действительно говорим1 миллион маленьких файлов, объединение их в один большой файл (или небольшое количество файлов) почти наверняка будет иметь огромное значение.Попробуйте в качестве эксперимента.

...