ValueError: массив слишком большой - не могу понять, как это исправить

1

Я запускаю следующий код:

traindata = trainData.read_csv('train.tsv', delimiter = '\t')

который вызывает эту функцию:

def read_csv(self, filename, delimiter = ',', quotechar = '"'):
    # open the file
    reader = csv.reader(open(filename, 'rb'), delimiter = delimiter, quotechar = quotechar)
    # read first line and extract its data 
    self.column_headings = np.array(next(reader))
    # read subsequent lines
    rows = []
    for row in reader:
        rows.append(row)
    self.data = np.array(rows)
    self.m, self.n = self.data.shape

Это позволило бы мне позвонить

m, n = traindata.data.shape
print m, n, traindata.column_headings

К сожалению, в моем вызове функции read_csv я получаю сообщение об ошибке:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-74-1cc5776f9a9c> in <module>()
     13 print "loading data.."
     14 
---> 15 traindata = trainData.read_csv('test.tsv', delimiter = '\t')
     16 
C:\pc in read_csv(self, filename, delimiter, quotechar)
     17         for row in reader:
     18             rows.append(row)
---> 19         self.data = np.array(rows)
     20         self.m, self.n = self.data.shape
     21 

ValueError: array is too big.

Как я могу исправить это поведение и разрешить запуск кода?

Изменить: данные представляют собой .tsv файл, извлечь здесь.

  • 0
    Насколько большой ваш файл? Что такое len rows ? Возможно, вам придется разделить ваши данные или использовать что-то вроде pytables или pandas, если он слишком велик, чтобы его можно было сделать за один раз. Ваши данные определенно выглядят так, как будто их можно поместить в какую-то базу данных.
  • 0
    @jozzas 21MB, 7395 строк по 27 столбцов. Я думал, что NumPy будет обрабатывать эти большие значения?
Показать ещё 4 комментария
Теги:
csv
arrays
numpy
python-2.7

1 ответ

7
Лучший ответ

Numpy создает массив огромных строк, каждый из которых имеет длину, установленную на максимальную длину любой одной строки в этом столбце, и вы, вероятно, исчерпываете ram в середине этого массивного выделения памяти.

Сделав

self.data = np.array(rows, dtype=object) 

numpy не нужно выделять большие куски новой памяти для строковых объектов - dtype=object сообщает numpy сохранять содержимое массива в качестве ссылок на существующие объекты python (строки уже существуют в вашем списке python rows) и эти указатели занимают гораздо меньше места, чем строковые объекты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню