Хотелось бы узнать, есть ли более эффективный способ загрузки содержимого файла в разреженную матрицу. Следующий код читается из большого файла (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.
Что определяет границы вашей разреженной матрицы? Просто количество строк в файле? Также вы можете поделиться ссылкой на очень маленькую версию своего гигантского файла, чтобы кто-нибудь мог воспроизвести и протестировать? – KobeJohn
Эти размеры задаются входным файлом, но он может изменяться в каждом прогоне. См. Пример версии моего входного файла здесь: https://github.com/nancyya/Public/blob/master/sample.traininset.working1000records.csv – Serendipity
Спасибо. Я посмотрю, смогу ли я что-нибудь сделать. Я всегда хотел попробовать что-то с разреженными матрицами в numpy. Однако можете ли вы проверить, работает ли файл данных с указанным выше кодом? Я получаю 'ValueError: недействительный литерал для int() с базой 10: 'da7f5cb5-2189-40cc-8a42-9fdedc29f925'' – KobeJohn