【问题标题】:itertools system error for large files大文件的itertools系统错误
【发布时间】:2017-09-22 08:15:18
【问题描述】:

我正在尝试从我的非常大的文件(〜300GB)中获取偶数行,并且我能够为一个大小几乎与我收到错误的文件相同的文件。代码是:

import itertools
import sys, os

with open('FILE.fasta') as f:
    fd = open("FILE.txt","w")
    fd.writelines(set(itertools.islice(f, 0, None, 2)))
    fd.close()

错误是:

   Traceback (most recent call last):
   File "new3.py", line 7, in <module>
   fd.writelines(set(itertools.islice(f, 0, None, 2)))
   SystemError: Negative size passed to PyString_FromStringAndSize

你真的认为是因为文件太大了吗?我在代码运行时检查了内存使用情况,它从未超过 50%..

我将不胜感激!

【问题讨论】:

  • 听起来更像是 PyString_FromStringAndSize 中的溢出。您可以将 itertools 调用移动到临时变量中吗?然后我们有一个更有用的堆栈跟踪
  • 鉴于您的问题,迭代输入文件句柄,使用enumerate() 获取行号并写入偶数行
  • 另外,如果你只需要每隔一行,set 是必要的吗?
  • 函数的来源在这里:svn.python.org/projects/python/trunk/Objects/stringobject.c这不是itertools的错误,而是Oytrhon本身。
  • @bapors No enumerate() 返回一个迭代器,你一次只能在内存中保存一行;现在也很清楚你的问题有第二部分(删除重复的行)并且sets 没有排序!你想要这样的东西stackoverflow.com/questions/1215208/…

标签: python line iteritems


【解决方案1】:

不要从底层迭代器生成set - 这是非常昂贵的过程。您应该可以直接将此迭代器提供给writelines

fd.writelines(itertools.islice(f, 0, None, 2))

其他小东西:

你不需要写

import sys, os

因为您已经在上面的行中导入了sys。删除上面的行或写import os

【讨论】:

  • 感谢您的回复,但是,它没有。如果我不将其指定为set,我仍然会看到重复项
猜你喜欢
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
相关资源
最近更新 更多