【发布时间】:2016-08-20 21:01:12
【问题描述】:
我有一个 ~1.81GB 的 CSV 文件,其中有 ~49m 行。它只有一列包含 38 个字符的字符串。
我在 Digital Ocean VPS(Ubuntu 12.04.4、Python 2.7、pandas 0.18.0、512MB RAM)上使用read_csv 阅读此文件。我一次读了5000行。但是,它开始在skiprows = 2800000 引发错误。这是我在重启的计算机上测试的代码,新启动的 Python:
>>> pd.read_csv(filename, skiprows=2800000, nrows=5000, header=None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ayhan/.conda/envs/swrm/lib/python2.7/site-packages/pandas/io/parsers.py", line 529, in parser_f
return _read(filepath_or_buffer, kwds)
File "/home/ayhan/.conda/envs/swrm/lib/python2.7/site-packages/pandas/io/parsers.py", line 295, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "/home/ayhan/.conda/envs/swrm/lib/python2.7/site-packages/pandas/io/parsers.py", line 608, in __init__
self.options, self.engine = self._clean_options(options, engine)
File "/home/ayhan/.conda/envs/swrm/lib/python2.7/site-packages/pandas/io/parsers.py", line 731, in _clean_options
skiprows = set() if skiprows is None else set(skiprows)
MemoryError
如果我使用skiprows=1000000 运行它,它可以正常工作。如果我尝试skiprows=1500000,它会再次引发错误,这很奇怪,因为错误是在达到 2800000 之后开始的。在此之前它通过每 5000 个乘数没有问题。知道为什么会这样吗?
代码在我的个人电脑上运行良好:
df = pd.read_csv(filename, skiprows=2800000, nrows=5000, header=None)
df.memory_usage()
Out[25]:
Index 72
0 40000
dtype: int64
编辑:
原来的循环是这样的:
current_chunk = 560
chnksize = 5000
for chunk in range(current_chunk, 1000):
df = pd.read_csv(filename, skiprows=chnksize*chunk, nrows=chnksize, header=None)
out = "chunk_" + format(chunk, "06d")
short_ids = df[0].str.slice(-11)
它从 API 查询 short_id 并将结果附加到文件中。但是我在顶部给出的代码段本身就会引发错误。
【问题讨论】:
-
你能展示你的循环吗?
-
对错误消息使用代码格式化按钮,而不是引用按钮。
-
@MaxU 我添加了循环(好吧,原始循环很长,所以我添加了我隔离错误的部分)——user2357112 修复了它。
-
@ayhan,你误用了
skiprows参数,你应该使用chunksize -
@MaxU 这实际上是我自己的不成功实施,这就是错字的原因。我知道我可以使用 pandas 的功能逐块读取,但我不知道我可以访问某个块,所以我使用的是 skiprows。