Найти - Пользователи
Полная версия: Ускорение обработки двоичного файла
Начало » Python для новичков » Ускорение обработки двоичного файла
1 2 3 4 5 6 7 8
erl
Здравствуйте Уважаемые!

Обрабатываю двоичный файл, специализированного формата(формат предоставить не предстваляется возможным), но суть его такова при встрече метки из двух байт завершается некая запись, которую необходимо парсить и так пока не конец файла.
    for line in open(soiurce_file,"rb").readlines():
#print "in, val: " + str(index) + ", " + line
new_line.extend([char for char in line])
далее ходим по new_line циклом for и ищем все что нужно через if

Файл 500 метров парсистся 11 минут - это ни в какие ворота не лезет, сосбвтенно как ускорить?
тот же алгоритм на C# парсится 45 секунд.
Ed
readlines читает весь файл как текстовый, разбивая его на строки. Оно вам надо? Читайте блоками, используя read и все будет хорошо.
o7412369815963
конвертнуть его в sqlite
erl
sqlite не работал не знаю как это будет выглядеть изучать времени нет, да да как обычно “Ни когда нет времени сделать все грамотно, зато потом уйма что бы все переделать” :-)
Нашел, собственно:
    fh = file(source_file,"rb")
a = array.array('b')
a.read(fh, 100000)
while a:
a = array.array('b')
try:
a.read(fh, 100000)
except Exception, exc:
if str(exc) == "not enough items in file":
break
Просто проход и запись и удаление в array: Total time exec: 0:00:00.789068
Это эталон, от которого и буду песни плясать.

Всем спасибо,
благодарствую Ed, благодарствую o7412369815963
erl
все перегрелся, теперь из массива не могу нормальные данные достать, все перековеркалось.
certanista
Можно просто
for line in open(soiurce_file,"rb")
Без readlines(). Субъективно быстрее, точно не мерил.
erl
пробовал ощутимого эффекта не заметил.
asv13
У меня разбор бинарников выглядит примерно так :

from struct import unpack
f = open(filename, 'rb')
while ok:
head = f.read(20) ## 20 = calcsize('>L8cL4c')
if len(head)==0:
ok = 0;
else:
z, name, datalen, type = unpack('>L8sL4s', head)
if datalen == 0 and ...
....
Может у вас и не такой формат, в котором размер и тип данных определяется в заголовках, но я обычно не читаю посимвольно, а знаю сколько сразу данных забрать в буфер (хоть сотню мегабайт) и как их сразу потом сконвертировать.
erl
Если все было так просто. За идею спасибо.
Ситуация в том, что конец конкретной записи определяется двух байтовой меткой, запись переменной длинны. т.е необходимо найти эту метку и лишь потом считать запись … и так много-много раз … до конца файла. Разбить файл на метки не получиться … вот это может проканать …
asv13
Я бы попробовал тогда использовать numpy.memmap и сразу определить положение всех меток.

Memory-mapped files are used for accessing small segments of large files on disk, without reading the entire file into memory. Numpy's memmap's are array-like objects.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB