2015-09-03 10 views
0

Хотелось бы узнать, есть ли более эффективный способ загрузки содержимого файла в разреженную матрицу. Следующий код читается из большого файла (8 ГБ), который имеет в основном нулевые значения (очень разреженные), а затем выполняет некоторую обработку на каждой строке. Я хотел бы выполнить арифметические операции над ним эффективно, поэтому я пытаюсь сохранить строки как разреженную матрицу. Поскольку количество строк в файле неизвестно заранее, а массив/матрица не являются динамическими, я должен сначала сохранить его в списке, а затем преобразовать в csr_matrix. Эта фаза («X = csr_matrix(X)») принимает много времени и памяти.
Любые предложения?Python - лучший способ прочитать разреженный файл в разреженной матрице

import numpy as np 
from scipy.sparse import csr_matrix 
from datetime import datetime as time 

global header_names; header_names = [] 

def readOppFromFile(filepath): 

    print "Read Opportunities From File..." + str(time.now()) 

    # read file header - feature names separated with commas 
    global header_names 

    with open(filepath, "r") as f: 

     i=0 

     header_names = f.readline().rstrip().split(',') 

     for line in f: 


      # replace empty string with 0 in comma-separated string. In addition, clean null values (replace with 0) 
      yield [(x.replace('null', '0') if x else 0) for x in line.rstrip().split(',')] 
      i += 1 

     print "Number of opportunities read from file: %s" % str(i) 

def processOpportunities(opp_data): 

    print "Process Opportunities ..." + str(time.now()) 

    # Initialization 
    X = [] 
    targets_array = [] 

    global header_names 

    for opportunity in opp_data: 

     # Extract for each opportunity it's target variable, save it in a special array and then remove it 
     target = opportunity[-1] # Only last column 
     targets_array.append(target) 
     del opportunity[-1] # Remove last column 

     X.append(opportunity)  

    print " Starting to transform to a sparse matrix" + str(time.now()) 
    X = csr_matrix(X) 
    print "Finished transform to a sparse matrix " + str(time.now()) 

    # The target variable of each impression 
    targets_array = np.array(targets_array, dtype=int) 
    print "targets_array" + str(time.now())   

    return X, targets_array 

def main(): 


    print "STRAT -----> " + str(time.now()) 
    running_time = time.now() 

    opps_data = readOppFromFile(inputfilename) 

    features, target = processOpportunities(opps_data) 

if __name__ == '__main__': 

    """ ################### GLOBAL VARIABLES ############################ """  
    inputfilename = 'C:/somefolder/trainingset.working.csv' 

    """ ################### START PROGRAM ############################ """  
    main() 

Обновлено: Размеры матрицы не являются постоянными, они зависят от входного файла и может изменяться в каждом запуске программы. Для небольшого образца моего ввода см. here.

+1

Что определяет границы вашей разреженной матрицы? Просто количество строк в файле? Также вы можете поделиться ссылкой на очень маленькую версию своего гигантского файла, чтобы кто-нибудь мог воспроизвести и протестировать? – KobeJohn

+0

Эти размеры задаются входным файлом, но он может изменяться в каждом прогоне. См. Пример версии моего входного файла здесь: https://github.com/nancyya/Public/blob/master/sample.traininset.working1000records.csv – Serendipity

+0

Спасибо. Я посмотрю, смогу ли я что-нибудь сделать. Я всегда хотел попробовать что-то с разреженными матрицами в numpy. Однако можете ли вы проверить, работает ли файл данных с указанным выше кодом? Я получаю 'ValueError: недействительный литерал для int() с базой 10: 'da7f5cb5-2189-40cc-8a42-9fdedc29f925'' – KobeJohn

ответ

2

Вы можете построить разреженную матрицу непосредственно, если следить за ненулевые вручную:

X_data = [] 
X_row, X_col = [], [] 
targets_array = [] 

for row_idx, opportunity in enumerate(opp_data): 
    targets_array.append(int(opportunity[-1])) 
    row = np.array(map(int, opportunity[:-1])) 
    col_inds, = np.nonzero(row) 
    X_col.extend(col_inds) 
    X_row.extend([row_idx]*len(col_inds)) 
    X_data.extend(row[col_inds]) 

print " Starting to transform to a sparse matrix" + str(time.now()) 
X = coo_matrix((X_data, (X_row, X_col)), dtype=int) 
print "Finished transform to a sparse matrix " + str(time.now()) 

Это строит матрицу в формате COO, который легко преобразовать в любой формат, который вы хотели:

X = X.tocsr()