Я запускаю следующий код:
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 файл, извлечь здесь.
Numpy создает массив огромных строк, каждый из которых имеет длину, установленную на максимальную длину любой одной строки в этом столбце, и вы, вероятно, исчерпываете ram в середине этого массивного выделения памяти.
Сделав
self.data = np.array(rows, dtype=object)
numpy не нужно выделять большие куски новой памяти для строковых объектов - dtype=object
сообщает numpy сохранять содержимое массива в качестве ссылок на существующие объекты python (строки уже существуют в вашем списке python rows
) и эти указатели занимают гораздо меньше места, чем строковые объекты.
len
rows
? Возможно, вам придется разделить ваши данные или использовать что-то вроде pytables или pandas, если он слишком велик, чтобы его можно было сделать за один раз. Ваши данные определенно выглядят так, как будто их можно поместить в какую-то базу данных.