У меня есть много двоичных файлов, содержащих вывод числовой модели. Это плоские двоичные файлы, содержащие вывод чисел с плавающей запятой. Файлы соответствуют четырехмерному массиву, отсортированному по порядку t-z-y-x, причем x изменяется быстрее. Дело в том, что для заданных x, y и z мне нужны значения для всех t. Простое решение простого чтения всего в один большой массив numpy и, конечно, работы data[:,z,y,x]
, но не очень эффективно (мне нужно прочитать много файлов).Эффективное считывание значений в двоичном файле
То, что я придумал теперь следующее (при условии, start_index
и volume_size
представлять правильные вещи):
data=array.array('f')
with file(my_filename,'rb') as infile:
for hour in range(amount_of_steps):
if hour==0:
infile.seek(start_index*data.itemsize,0)
else:
infile.seek(data.itemsize*volume_size,1)
data.fromfile(infile,1)
не должны беспокоиться о enddianness и переносимости (хотя последний имеет в конечно, некоторые достоинства). Все это работает на Linux, и маловероятно, что он когда-либо будет работать над чем-то другим. Поэтому возникает вопрос: есть ли способ сделать это с более высокой производительностью? Это делается для многих файлов. Я попытался распараллеливать, но это действительно не помогает. Получение нового оборудования не является опцией, а SSD еще меньше - из-за объема данных. Также не меняется формат файла.
У меня еще нет винта mmap и точно не знаю, для чего предназначен StringIO. Может быть, вы можете немного разобраться? Чтение всего файла происходит медленнее в моем опыте. Файлы не огромны (что-то около 10 МБ), но мне, возможно, придется работать через тысячи из них. – Christoph
Отредактировал свой ответ, чтобы быть более точным. – glglgl
Спасибо. Я посмотрю на это. Дело в том, что я пропускаю около половины мегабайта с infile.seek(), поэтому да, мой размер шага очень велик. – Christoph