【发布时间】: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/…