如何解决Python中的内存错误

如何解决Python中的内存错误,python,memory,Python,Memory,我正在处理几个大的txt文件,每个文件大约有8000000行。这些行的一个简短示例是: usedfor zipper fasten_coat usedfor zipper fasten_jacket usedfor zipper fasten_pant usedfor your_foot walk atlocation camera cupboard atlocation camera drawer atlocation camera house relatedto more plenty 将

我正在处理几个大的txt文件,每个文件大约有8000000行。这些行的一个简短示例是:

usedfor zipper fasten_coat
usedfor zipper fasten_jacket
usedfor zipper fasten_pant
usedfor your_foot walk
atlocation camera cupboard
atlocation camera drawer
atlocation camera house
relatedto more plenty
将它们存储在字典中的代码是:

dicCSK = collections.defaultdict(list)
for line in finCSK:
    line=line.strip('\n')
    try:
        r, c1, c2 = line.split(" ")
    except ValueError:
        print line
    dicCSK[c1].append(r+" "+c2)
它在第一个txt文件中运行良好,但是当它运行到第二个txt文件时,我得到了一个错误
MemoryError

我正在使用Windows7 64位和python 2.7 32位,intel i5 cpu,8Gb内存。我怎样才能解决这个问题

进一步解释:
我有四个大文件,每个文件包含许多实体的不同信息。例如,我想查找猫、它的父节点动物和子节点波斯猫的所有信息,依此类推。因此,我的程序首先读取字典中的所有txt文件,然后扫描所有字典以查找
cat
及其父项和子项的信息

最简单的解决方案:您的虚拟地址空间可能已经用完了(任何其他形式的错误通常意味着在您最终获得
内存错误之前运行很长一段时间非常缓慢)。这是因为Windows(和大多数操作系统)上的32位应用程序的用户模式地址空间限制为2GB(Windows可以调整为3GB,但这仍然是一个低上限)。您有8GB的RAM,但您的程序无法(至少)使用其中的3/4。Python有相当多的每个对象开销(对象头、分配对齐等),很可能字符串本身使用的RAM接近GB,这是在处理字典、程序的其余部分、Python的其余部分等的开销之前。如果内存空间碎片足够多,字典需要增长,它可能没有足够的连续空间来重新分配,您将得到一个
内存错误

安装64位版本的Python(如果可以,我建议出于其他原因升级到Python 3);它将使用更多的内存,但随后,它将访问更多的内存空间(以及更多的物理RAM)


如果这还不够,考虑转换为<代码> SqLITE3数据库(或其他一些DB),因此当数据对主存来说太大时,它自然会溢出到磁盘,而仍然有相当有效的查找。

< P>假设您的示例文本代表所有文本,我的机器上一行将消耗大约75字节:

In [3]: sys.getsizeof('usedfor zipper fasten_coat')
Out[3]: 75
做一些粗略的计算:

75 bytes * 8,000,000 lines / 1024 / 1024 = ~572 MB
因此,对于其中一个文件,仅存储字符串大约需要572 meg。一旦您开始添加其他类似结构和大小的文件,您将很快接近您的虚拟地址空间限制,如@ShadowRanger的回答中所述


如果升级python对您来说是不可行的,或者如果它只是起到了作用(毕竟您的物理内存有限),那么您确实有两个选择:在加载和读取输入文件之间将结果写入临时文件,或者将结果写入数据库。由于在聚合字符串后需要对其进行进一步的后处理,因此将其写入数据库将是更好的方法。

这是您真正的代码吗?我想不是。例如,什么是finCSK?为什么需要字典中的这些数据?将其放入数据库或类似的存储器中,以便查询。@e4c5,我忽略了问题中的输入过程,我读取了文件,然后
fin
打开了file@DisplayName,我需要在字典里读过之后做更多的事情。所以我的代码中需要它们。我在您的描述中仍然没有看到任何需要在内存中完成的内容。我刚刚安装了一个64位python。它比我原来的程序运行得更远,但在使用了一半内存(大约4Gb)后,我仍然出现
内存错误。我觉得奇怪,为什么在内存只有一半的情况下会发生错误。@flyingmouse:您运行时没有页面文件吗?通常,即使使用了物理RAM,它也应该继续运行(如果速度较慢),直到页面文件已满。如果没有页面文件,那么一个足够大的字典调整大小可能会导致4GB左右的问题;如果您有足够的数据来实现这一点,那么我强烈建议您切换到DB(一个简单的DB,如作为Python模块提供的
sqlite3
,或者更强大的DB,如PostgreSQL、MySQL等)。