Ошибка памяти в Python при преобразовании в массив

Мой код показан ниже:

from sklearn.datasets import load_svmlight_files
import numpy as np

perm1 =np.random.permutation(25000)
perm2 = np.random.permutation(25000)

X_tr, y_tr, X_te, y_te = load_svmlight_files(("dir/file.feat", "dir/file.feat"))

#randomly shuffle data
X_train = X_tr[perm1,:].toarray()[:,0:2000]
y_train = y_tr[perm1]>5 #turn into binary problem

Код до сих пор работает нормально, но когда я пытаюсь преобразовать еще один объект в массив, моя программа возвращает ошибку памяти.

Код:

X_test = X_te[perm2,:].toarray()[:,0:2000]

Ошибка:

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-7-31f5e4f6b00c> in <module>()
----> 1 X_test = X_test.toarray()

C:\Users\Asq\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\sparse\compressed.pyc in toarray(self, order, out)
    788     def toarray(self, order=None, out=None):
    789         """See the docstring for `spmatrix.toarray`."""
--> 790         return self.tocoo(copy=False).toarray(order=order, out=out)
    791 
    792     ##############################################################

C:\Users\Asq\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\sparse\coo.pyc in toarray(self, order, out)
    237     def toarray(self, order=None, out=None):
    238         """See the docstring for `spmatrix.toarray`."""
--> 239         B = self._process_toarray_args(order, out)
    240         fortran = int(B.flags.f_contiguous)
    241         if not fortran and not B.flags.c_contiguous:

C:\Users\Asq\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\sparse\base.pyc in _process_toarray_args(self, order, out)
    697             return out
    698         else:
--> 699             return np.zeros(self.shape, dtype=self.dtype, order=order)
    700 
    701 

MemoryError: 

Я новичок в Python, и я не знаю, нужно ли вручную исправлять ошибку памяти.

Другие части моего кода возвращают те же ошибки (например, обучение с помощью knn или ann).

Как я могу это исправить?


person Asqan    schedule 26.05.2014    source источник
comment
Вероятно, вы исчерпали доступную память вашей системы. Купите больше или выделите больше (обмен / пейджинг).   -  person Brian Cain    schedule 27.05.2014
comment
Я использую окна, и теперь память подкачки увеличена до 4 ГБ. У меня баран 8гб. И python теперь использует 2,5 ГБ моей памяти (просто код, пока не будет запущен).   -  person Asqan    schedule 27.05.2014
comment
Было бы полезно, если бы вы могли заменить строку в своем коде, которая загружает данные svm, установив эти переменные на что-то случайное с той же формой и типом матрицы, чтобы можно было попытаться воспроизвести проблему путем копирования и вставки. Если вы не можете этого сделать, укажите хотя бы формы массивов.   -  person eickenberg    schedule 27.05.2014


Ответы (2)


В подобных случаях часто можно избежать преобразования разреженных матриц в плотный формат.

Например, вы можете выполнить перестановку и легко нарезать с помощью CSR или Редкие форматы CSC.

Вы не разместили следующий код, но я подозреваю, что это можно сделать и для обработки разреженных входных данных. Если это правда, проблемы с памятью больше не будут проблемой.

person perimosocordiae    schedule 27.05.2014
comment
Ваше предложение верно. до тех пор, пока мне не нужен плотный формат. Но мне нужно масштабировать данные, а для некоторых алгоритмов машинного обучения мне понадобятся плотный формат. Но я боюсь, что ваше предложение - единственный ответ для решения ошибки памяти. Но тогда я не смогу использовать алгоритмы, которые хотел бы использовать. - person Asqan; 27.05.2014
comment
@Asqan Необходимость масштабирования зависит от характера данных. Редкие данные часто представляют собой гистограммы, и их следует нормализовать по L2, а не масштабировать. Нормализация L2 сохраняет разреженность. - person Fred Foo; 27.05.2014
comment
Я знаю, что это старый вопрос, но моя первая реакция была связана с поиском способа назначить dtype, отличный от float64. toarray () заполняется 0,0 в формате float64. Есть ли способ сделать это? - person MehmedB; 21.01.2020

Используйте преобразование на месте numpy.asarray () вместо toarray (), которое требует новой памяти.

person Rohit Kumar    schedule 26.05.2017
comment
Не могли бы вы объяснить немного больше? - person Dieter Meemken; 26.05.2017