медленная обработка файлов в python - PullRequest
0 голосов
/ 27 октября 2010

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

Проблема: когда я запускаю программу непрерывно, время выполнения увеличивается. Первоначально время выполнения составляет менее секунды; позже это достигает до 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

Ответы [ 2 ]

4 голосов
/ 27 октября 2010

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

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

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

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

3 голосов
/ 27 октября 2010

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

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

Если оставить блок with, файл автоматически закроется.

...