2010-10-27 5 views
0

Я пытаюсь работать с файлом с помощью python.Aim, чтобы постоянно читать файл размером (100 байт), упаковывать и отправлять их через сокет. Эти файлы считываются из каталога.медленная обработка файлов в python

Проблема: когда я запускаю программу непрерывно, время выполнения увеличивается. Первоначально время выполнения меньше секунды; позже он достигает 8 ~ 10 секунд. Я не могу получить точную причину задержки. Если кто-то может рассказать о проблеме, это будет более полезно.

Здесь я прилагаю мой код ...

def handlefile(filename): 
     for sat in range(len(Numfiles)): 
       filename = 
       fsize = os.path.getsize(filename) 
       if fsize != 100: 
         continue 
       rfile = open(filename,'rb') 
       text = rfile.read() 
       msg = struct.unpack("<100b",text) 
       for i in range(len(msg)): 
         packMessage = packMessage + struct.pack("<b",msg[i]) 
       print "time:",datetime.datetime.now() - startTime 

Файл бинарные файлы.

Начальное время, затрачиваемое: 671 мс

на выполнение непрерывно в течение более чем в 10 раз, время медленно увеличивается. Последние несколько значений, 671ms . . . . 9,879 мс 88,686 мс 135,954 мс

Я использую версию Python-2.5.4.

Если кто-то сталкивался с подобной проблемой. Пожалуйста, предоставьте мне несколько материалов.

Благодаря Das

+1

Я не вижу rfile.close() – soulseekah

+2

Пожалуйста, напишите фактический текущий код, в нем есть несколько синтаксических ошибок, которые помешали бы ему запустить. –

ответ

3

Вы проверили количество файлов обрабатывает ваш процесс открытым? Вы можете йа Используйте with-statement, чтобы убедиться, что они закрываются, когда больше не нужно:

with open(filename, 'rb') as rfile: 
    text = rfile.read() 
    # etc. 

Когда with -блока остался, файл будет автоматически закрыт.

4

Из того, что я вижу, packMessage растет монотонно:

packMessage = packMessage + struct.pack("<b",msg[i]) 

Если вы повторить это много раз, она может вырасти большой, потребляют много памяти, и в какой-то момент ваше приложение может стать гораздо медленнее. Попробуйте найти top или htop при запуске вашей программы (в top, нажмите M, чтобы отсортировать по распределению памяти, f, чтобы добавить резидентное поле памяти).

Также открытие и чтение одного и того же файла каждый раз не лучшее решение с точки зрения производительности. Прочитайте его только один раз перед входом в цикл.

Смежные вопросы