0
想知道是否有更有效的方法将文件内容加载到稀疏矩阵中。 下面的代码从一个大文件(8GB)中读取,该文件大多为零值(非常稀疏),然后在读取的每一行上执行一些处理。 我想对其进行有效的算术运算,所以我尝试将行存储为稀疏矩阵。 由于文件中的行数并未预先知道,而且数组/矩阵不是动态的,我必须先将它存储在一个列表中,然后转换为一个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