我正在使用 pandas 来管理一个由 8 字节整数组成的大型数组。这些整数作为逗号分隔的 CSV 文件中列的空格分隔元素包含在内,数组大小约为 10000x10000。
Pandas 能够从前几列中快速读取逗号分隔的数据作为 DataFrame,并以最小的麻烦快速将空格分隔的字符串存储在另一个 DataFrame 中。当我尝试将表格从以空格分隔的字符串的单列转换为 8 位整数的 DataFrame 时,问题就来了。
我尝试了以下方法:
intdata = pd.DataFrame(strdata.columnname.str.split().tolist(), dtype='uint8')
但是内存使用是无法忍受的——10MB 的整数会消耗 2GB 的内存。我被告知这是语言的限制,在这种情况下我无能为力。
作为一种可能的解决方法,建议我将字符串数据保存到 CSV 文件,然后将 CSV 文件重新加载为以空格分隔的整数的 DataFrame。这很好用,但为了避免写入磁盘导致的减速,我尝试写入 StringIO 对象。
这是一个最小的非工作示例:
import numpy as np
import pandas as pd
from cStringIO import StringIO
a = np.random.randint(0,256,(10000,10000)).astype('uint8')
b = pd.DataFrame(a)
c = StringIO()
b.to_csv(c, delimiter=' ', header=False, index=False)
d = pd.io.parsers.read_csv(c, delimiter=' ', header=None, dtype='uint8')
这会产生以下错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 443, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 228, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 533, in __init__
self._make_engine(self.engine)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 670, in _make_engine
self._engine = CParserWrapper(self.f, **self.options)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 1032, in __init__
self._reader = _parser.TextReader(src, **kwds)
File "parser.pyx", line 486, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:4494)
ValueError: No columns to parse from file
'c.csv'
这令人费解,因为如果我使用而不是运行完全相同的代码c
,则代码可以完美运行。另外,如果我使用以下代码段:
file = open('c.csv', 'w')
file.write(c.getvalue())
保存 CSV 文件没有任何问题,因此写入 StringIO 对象不是问题。
我可能需要在 read_csv 行中替换c
为c.getvalue()
,但是当我这样做时,解释器会尝试c
在终端中打印 的内容!当然有办法解决这个问题。
在此先感谢您的帮助。