Обращаясь к «MemoryError» при выполнении многопоточных операций ввода / вывода в формате TXT, в поисках лучшего решения - PullRequest
2 голосов
/ 18 июля 2011

Я работаю только с одним txt-файлом, размер которого составляет около 4 МБ, и для этого файла часто требуется ввод-вывод, такой как добавление новых строк / поиск определенных строк, включающих определенные фразы / замена определенной строки другой строкой и т. Д.

Чтобы обработать файл «одновременно», threading.RLock() используется для блокировки ресурса, когда он работает.Поскольку это не большой файл, я просто использую readlines(), чтобы прочитать их все в список и выполнить поиск, а также read(), чтобы прочитать весь файл в строку FileContent, и использовать FileContent.replace("demo", "test") длязаменить определенные фразы на все, что я хочу.

Но проблема в том, что я иногда сталкиваюсь с «MemoryError», я имею в виду иногда каждые 3-4 дня, иногда дольше, например, неделю или около того.Я тщательно проверил свой код и на момент окончания каждого потока не было закрытых файловых объектов.Что касается файловой операции, я просто использую:

CurrentFile = open("TestFile.txt", "r")
FileContent = CurrentFile.read()
CurrentFile.close()

Я думаю, что, возможно, python не удаляет бесполезные переменные так быстро, как я ожидал, что в итоге приводит к нехватке памяти, поэтому я собираюсь использовать withзаявление, которое может быть быстрым в сборке мусора.У меня нет опыта с таким утверждением, кто-нибудь знает, поможет ли это?Или есть лучшее решение для моей проблемы?

Большое спасибо.

Добавлено: Мой скрипт мог бы сделать много замен за короткий промежуток времени, так что я думаю, возможно, сотни потоковиспользование FileContent = CurrentFile.read () приведет к нехватке памяти, если FileContent не удаляется быстро?Как мне отладить такую ​​проблему?

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Не видя больше вашего кода, невозможно понять, почему у вас заканчивается память.Оператор with является предпочтительным способом открывать и закрывать файлы, когда это сделано, хотя:

with open("TestFile.txt", "r") as current_file:
    file_content = current_file.read()

(извините, UpperCamelCase для переменных просто не подходит мне ...)

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

0 голосов
/ 18 июля 2011

Звучит так, будто у тебя утечка памяти. Python будет использовать всю доступную системную память, прежде чем выдавать MemoryError, и 4 МБ звучат не очень. От того, где у вас утечка памяти, зависит ваш код, который вы не указали в своем вопросе.

Наблюдали ли вы за использованием памяти в задаче управления ОС?

Вот инструмент для отладки использования памяти Python (требуется отладочная компиляция Python):

http://guppy -pe.sourceforge.net / # бесформенный

Используйте его, чтобы проанализировать использование памяти вашего кода и увидеть, какие объекты, которые вы создаете, не освобождаются.

...