Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2011 14:57:05

erl
Зарегистрирован: 2011-01-30
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

Здравствуйте Уважаемые!

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

    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 секунд.



Офлайн

#2 Янв. 30, 2011 16:26:41

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

readlines читает весь файл как текстовый, разбивая его на строки. Оно вам надо? Читайте блоками, используя read и все будет хорошо.



Офлайн

#3 Янв. 30, 2011 18:24:38

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

Офлайн

#4 Янв. 30, 2011 20:02:23

erl
Зарегистрирован: 2011-01-30
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

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



Офлайн

#5 Янв. 31, 2011 13:16:38

erl
Зарегистрирован: 2011-01-30
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

все перегрелся, теперь из массива не могу нормальные данные достать, все перековеркалось.



Офлайн

#6 Янв. 31, 2011 21:35:53

certanista
От:
Зарегистрирован: 2010-10-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

Можно просто

for line in open(soiurce_file,"rb")
Без readlines(). Субъективно быстрее, точно не мерил.



Офлайн

#7 Фев. 2, 2011 09:25:54

erl
Зарегистрирован: 2011-01-30
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

пробовал ощутимого эффекта не заметил.



Офлайн

#8 Фев. 2, 2011 11:21:24

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

У меня разбор бинарников выглядит примерно так :

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 ...
....
Может у вас и не такой формат, в котором размер и тип данных определяется в заголовках, но я обычно не читаю посимвольно, а знаю сколько сразу данных забрать в буфер (хоть сотню мегабайт) и как их сразу потом сконвертировать.



Офлайн

#9 Фев. 2, 2011 12:13:34

erl
Зарегистрирован: 2011-01-30
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

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



Отредактировано (Фев. 2, 2011 12:14:52)

Офлайн

#10 Фев. 2, 2011 13:00:32

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение обработки двоичного файла

Я бы попробовал тогда использовать 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.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version