2015-11-11 2 views
1

У меня есть большая матрица (1,017,209 строк), из которой мне нужно считывать элементы, выполнять операции над ними и собирать результаты в списки. Когда я делаю это на 10 000 строк или даже 100 000, он заканчивается в разумные сроки, однако 1 000 000 нет. Вот мой код:Эффективные операции с списком

import pandas as pd 

data = pd.read_csv('scaled_train.csv', index_col=False, header=0) 
new = data.as_matrix() 

def vectorized_id(j): 
    """Return a 1115-dimensional unit vector with a 1.0 in the j-1'th position 
    and zeroes elsewhere. This is used to convert the store ids (1...1115) 
    into a corresponding desired input for the neural network. 
    """ 
    j = j - 1  
    e = [0] * 1115 
    e[j] = 1.0 
    return e 

def vectorized_day(j): 
    """Return a 7-dimensional unit vector with a 1.0 in the j-1'th position 
    and zeroes elsewhere. This is used to convert the days (1...7) 
    into a corresponding desired input for the neural network. 
    """ 
    j = j - 1 
    e = [0] * 7 
    e[j] = 1.0 
    return e 

list_b = [] 
list_a = [] 

for x in xrange(0,1017209): 
    a1 = vectorized_id(new[x][0]) 
    a2 = vectorized_day(new[x][1]) 
    a3 = [new[x][5]] 
    a = a1 + a2 + a3 
    b = new[x][3] 
    list_a.append(a) 
    list_b.append(b) 

Что мешает этому масштабу (что является узким местом)? Есть ли способы его оптимизации?

+1

Вы смотрите 'new [x]' четыре раза. –

+1

Сколько у вас памяти? Вы используете тонну этого. – user2357112

+1

Вам нужна только одна строка за раз, но, кажется, читает весь файл в памяти. –

ответ

1

Пара вещей:

  1. Не читать весь файл сразу, вы, кажется, не делать ничего, что требует несколько строк.
  2. Посмотрите на использование csv.reader для загрузки ваших данных.
  3. Действительно прекратите индексирование в гигантском списке new.
+0

@ Действительно, я столкнулся с проблемой памяти. Я начал использовать csv.reader, но он по-прежнему не работает, примерно на 320 000 мой объем использования памяти составляет 95%, и он в основном останавливается. Я вычислил, что vectorized_id() вызывает проблему, поскольку она дает вектор длины 1115 для каждой строки. Таким образом, это приведет к составлению списка из нескольких ГБ, как упоминал Риши? Тогда, я думаю, я должен сохранить промежуточные результаты на жестком диске и пустую память. Любые советы о том, как это сделать? –

+1

Как отметил @Rishi, вы используете много памяти. Если вам действительно нужны все записи, которые вы создаете, вам, вероятно, придется записывать их в файлы и перезагружать файлы позже, когда они вам понадобятся. –

Смежные вопросы