在执行多线程txt文件I / O时面对“MemoryError”,寻找更好的解决方案

时间:2011-07-18 14:04:01

标签: python multithreading memory-management file-io with-statement

我只使用一个大约4 MB的txt文件,并且文件需要经常I / O,例如添加新行/搜索包含特定短语的某些行/用另一行替换某行等。< / p>

为了“同时”处理文件,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 个答案:

答案 0 :(得分:1)

如果没有看到更多代码,就无法知道为什么内存不足。 with语句是打开文件并在完成后关闭它们的首选方法:

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

(抱歉,变量的UpperCamelCase对我来说不合适......)

坦率地说,我怀疑这会解决你的问题,如果你正在关闭问题中显示的文件,但它仍然是很好的做法。

答案 1 :(得分:0)

听起来你正在泄露记忆。在给出MemoryError之前,Python将使用所有可用的系统内存,4 MB听起来并不多。泄漏内存的地方取决于您在问题中未提供的代码。

您是否在操作系统的任务管理中查看了内存使用情况?

这是一个调试Python内存使用的工具(需要Python调试编译):

http://guppy-pe.sourceforge.net/#Heapy

使用它来分析您的代码内存使用情况,并查看您正在创建哪些不会被释放的对象。