当前位置: 首页 > 面试题库 >

如何解决Python中的内存错误

田仲卿
2023-03-14
问题内容

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

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

我正在使用Windows 7 64bit和python 2.7 32bit,intel i5 cpu,8Gb内存。我该如何解决这个问题?

进一步说明:我有四个大文件,每个文件包含许多实体的不同信息。例如,我要查找有关cat其父节点animal和子节点persian cat等的所有信息。因此,我的程序首先读取字典中的所有txt文件,然后扫描所有字典以查找有关cat其父级和子级的信息。


问题答案:

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

安装64位版本的Python(如果可以,出于其他原因,我建议升级到Python 3);它会使用更多的内存,但随后,它会 进入 到一个 很大
更多的存储空间(并物理RAM以及)。

如果这还不够,请考虑转换为sqlite3数据库(或其他数据库),这样当数据对于主内存来说太大时,它自然会溢出到磁盘上,同时仍然具有相当高效的查找。



 类似资料:
  • 问题内容: 由于GWT是用javascript编译且代码是用JAVA编写的事实,解决GWT内存泄漏的最佳方法是什么? 问题答案: 我可以推荐2件事: 阅读这篇文章 处理完所有引用后,将其无效。 祝好运!

  • 问题内容: 我有一个Python程序,它运行一系列实验,没有打算从一个测试存储到另一个测试的数据。我的代码包含一个我完全找不到的内存泄漏(我已经查看了内存泄漏的其他线程)。由于时间限制,我不得不放弃寻找泄漏的机会,但是如果我能够隔离每个实验,该程序可能会运行足够长的时间以产生所需的结果。 在单独的线程中运行每个测试是否有帮助? 还有其他隔离泄漏影响的方法吗? 具体情况详 我的代码分为两部分:实验运

  • 在阅读了大量有关MAT的内容后,我使用我的生产堆转储来分析内存泄漏问题。下面是泄漏报告错误: 线程org.apache.tomcat.util.threads.taskthread@0x6d8be0a30 http-bio-8443-exec-115保留总大小为3,695,816,440(89.03%)字节的局部变量。 内存累积在“'<'System class Loader'>”加载的“java

  • 我正在使用phpspreadsheet,我想修改一个有4张表的xlsx文件。我只想在2张表中插入数据,但我想将所有4张表复制到新的xlsx文件中。当我这样做时,我会得到以下错误: 编辑:我已经尝试用下面的代码复制我不需要编辑的工作表: 但现在我得到另一个错误: 致命错误:未捕获错误:调用C:\xampp\htdocs\offerconfigurator\vendor\phpoffice\phpsp

  • 问题内容: 当我尝试运行以下程序时,出现了以上错误。有人可以解释什么是内存错误,以及如何解决此问题?。 该程序将字符串作为输入,并找到所有可能的子字符串,并从中创建一个集(按字典顺序),并应在用户要求的相应索引处打印值,否则应打印“无效” 问题答案: 这一个在这里: 对于大型字符串,这似乎非常低效且昂贵。 做得更好 缓冲区对象保留对原始字符串以及开始和长度属性的引用。这样,不会发生不必要的数据重复

  • 严重:web应用程序创建了一个ThreadLocal,其键类型为[org.apache.log4j.helpers.ThreadLocalMap](值为[org.apache.log4j.helpers.ThreadLocalMap@3ac5b23e])和值类型为[java.util.Hashtable](值为[{userhost=192.168.15.90,userid=127,username