Панды не могут читать из большого объекта StringIO

Я использую панд для управления большим массивом 8-байтовых целых чисел. Эти целые числа включены в качестве разделенных пробелами элементов столбца в CSV-файле с разделителями-запятыми, а размер массива составляет около 10000x10000.

Pandas может быстро считывать данные с разделителями-запятыми из первых нескольких столбцов как DataFrame, а также быстро сохранять строки с разделителями-пробелами в другом DataFrame с минимальными трудностями. Проблема возникает, когда я пытаюсь преобразовать таблицу из одного столбца строк, разделенных пробелами, в DataFrame из 8-битных целых чисел.

Я пробовал следующее:

intdata = pd.DataFrame(strdata.columnname.str.split().tolist(), dtype='uint8')

Но использование памяти невыносимо - целое число 10 МБ потребляет 2 ГБ памяти. Мне сказали, что это ограничение языка, и я ничего не могу с этим поделать.

В качестве возможного обходного пути мне посоветовали сохранить строковые данные в 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 не является проблемой.

Возможно, мне нужно заменитьc сc.getvalue() в строке read_csv, но когда я это делаю, интерпретатор пытается распечатать содержимоеc в терминале! Конечно, есть способ обойти это.

Заранее спасибо за помощь.

Ответы на вопрос(1)

Ваш ответ на вопрос