2

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

为了“同时”处理文件,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 没有快速删除,使用 FileContent = CurrentFile.read() 的数百个线程可能会导致内存不足?如何调试此类问题?

4

2 回答 2

1

如果不查看更多代码,就不可能知道内存不足的原因。该with语句是打开文件并在完成后关闭它们的首选方式:

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

(抱歉,变量的 UpperCamelCase 对我来说看起来不正确......)

坦率地说,如果您真的像问题中所示那样关闭文件,我怀疑这会解决您的问题,但这仍然是一种很好的做法。

于 2011-07-18T14:07:12.517 回答
0

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

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

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

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

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

于 2011-07-18T14:56:08.267 回答