我只使用一个大约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会导致内存不足?我该如何调试这个问题?
答案 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
使用它来分析您的代码内存使用情况,并查看您正在创建哪些不会被释放的对象。