Python程序doen';当使用数Gb的RAM时,无法完成

Python程序doen';当使用数Gb的RAM时,无法完成,python,csv,python-3.x,Python,Csv,Python 3.x,我正在处理一些有很多行的.csv文件,我的程序在结束时遇到了问题 当我用小csv(3个1000行csv和1个5.700.000行csv)启动程序时,我的程序在大约21秒钟内用大约1.5Gb的内存完成了它的神奇,当我开始使用另一个大csv(2个1000行csv和2个5.7到5.9百万行csv)时,最后一切都变糟了 程序读取所有行,将它们存储在内存中(可能这不是最好的方法),完成所有工作(同时使用4Gb和7Gb或RAM的峰值),然后完成所有工作(最后一条指令是写一个日志信息,说明它已结束),但程序没

我正在处理一些有很多行的.csv文件,我的程序在结束时遇到了问题

当我用小csv(3个1000行csv和1个5.700.000行csv)启动程序时,我的程序在大约21秒钟内用大约1.5Gb的内存完成了它的神奇,当我开始使用另一个大csv(2个1000行csv和2个5.7到5.9百万行csv)时,最后一切都变糟了

程序读取所有行,将它们存储在内存中(可能这不是最好的方法),完成所有工作(同时使用4Gb和7Gb或RAM的峰值),然后完成所有工作(最后一条指令是写一个日志信息,说明它已结束),但程序没有结束执行,只是保持在那里,没有完成,没有释放它一直使用的4Gb内存

最后几行:

with open('insertdata.csv','w',newline='') as csvdat:
    csvwriter = csv.writer(csvdat,dialect='excel', delimiter=';', quotechar='|')

    for i, data in enumerate(exitlist):
        logger.debug('Start searching rel data for line %s', i)
        try:
        # ---- do things ----
# ---- everything ends here, now it's on the same level as "with open..." ----
logger.info('%s lines inserted into inserdata.csv',n)
if nerror > 0:
    logger.warning('%s document errors found', nerror)

csvlist2 = None
csvlist3 = None
exitlist = None
didlist = None

print("ends")
quit()
日志的最后几行:

2016-03-31 19:02:19810-main-错误- 在查询3 csv中找不到“3831414”

2016-03-31 19:02:19810-main-错误- 在查询3 csv中找不到“3831778”

2016-03-31 19:02:19810-main-错误- 在查询3 csv中找不到“3831416”

2016-03-31 19:02:19810-main-信息-955行插入到 insertdata.csv

2016-03-31 19:02:19810-主要-警告-45 发现文档错误

这个错误是一个受控的异常,我认为如果循环的最后一次迭代发生了什么异常,它可能是问题所在,但在我的上一次测试中,它不是问题所在。 正如您所看到的,昨天19:02它完成了,但是今天8:44我在“工作”了一整晚之后,从cmd手动完成了python程序

使用这么大的内存会有问题吗? 顺便说一句,我在一百行之后使用gc.collect()来释放已删除条目的空间(我使用字典,当使用字典时,我会从中删除键),但在使用它之前也是这样


提前感谢

为什么您需要一次将所有行存储在内存中?我不知道另一种方法,但我正在做的是将4个csv的数据合并到一个中,因此对于第一个csv的每一行,我在其他3个中搜索并获取数据。编辑(在时间之前按intro):也许我可以一次做一个csv,然后清除它…删除字典中的所有键不一定会回收键使用的内存,而是重新分配给一个空字典。您可以使用标准库中的
shelve
将词典存储在磁盘上,但速度当然较慢。这不是您所要求的,但是通过使用命令行工具,您可以更轻松地删除重复的行。使用
cat
将文件合并到单个文件中,使用
sort
对行进行排序,并使用
uniq
过滤掉重复的行(?)配置您的程序处理某个csv文件,它可以使用
cProfile
模块处理,并查看它在哪里花费了大部分时间。优化这些区域或将日志添加到这些部分,以便您可以确定它挂起在无法处理的文件上的位置。