我试图找到一种有效的方法来读取一个非常大的文本文件(大约2000000行)。大约90%的这些行(最后90%实际上)有三列格式,用于存储稀疏矩阵。在
这是我所做的。首先,我处理文件的前10%:
i=1
cpt=0
skip=0
finnum=0
indice=1
vec=[]
mat=[]
for line in fileinput.input("MY_TEXT_FILE.TXT"):
if i==1:
# skipping the first line
skip = 1
if (finnum == 0)and(skip==0):
# special reading operation for the first 10% (approximately)
tline=shlex.split(line)
ind_loc=0
while ind_loc<len(tline):
if (int(tline[ind_loc])!=0):
vec.append(int(tline[ind_loc]))
ind_loc=ind_loc+1
if (finnum == 1)and(skip==0):
print('finnum = 1')
h=input()
break
if (' 0' in line):
finnum = 1
if skip == 0:
i=i+1
else:
skip=0
i=i+1
cpt=cpt+1
然后我把剩下的90%提取到一个列表中:
^{pr2}$这样可以非常快速地读取文本文件,并且内存消耗很低。缺点是矩阵是一个字符串列表,每个字符串类似于:
>>> matrix[23]
' 5 11 8.320234929063493E-008\n'
我曾尝试在矩阵和相结合的行上使用迭代过程shlex.分离从字符串列表转到数组的命令,但这非常耗时。在
你知道从字符串列表到数组的快速策略吗?在
我想知道的是,是否有比这个过程更快的方法:
A=[0]*len(matrix)
B=[0]*len(matrix)
C=[0]*len(matrix)
for i in range(len(matrix)):
line = shlex.split(matrix[i])
A[i]=float(line[0])
B[i]=float(line[1])
C[i]=float(line[2])
阿兰
当您处理大量的数字数据时,您应该真正使用Numpy,而不是纯python。这通常要快10倍以上,并且可以让您访问Matlab风格的复杂计算。我现在没有时间转换代码(有一个示例文件是最容易的),但是可以肯定的是,使用numpy.loadtxt可以快速有效地读取文件的第二部分。跳过第一部分并转换为float的代码的第二部分可能可以这样完成:
您可能想使用数据格式(通过添加
dtype = (int, int, float)
左右,不知道如何做到这一点),因为我猜前两列是整数。在还要注意,numpy有一个sparse matrix数据类型可用。在
听着,我想出了一个混合的解决方案,它似乎工作得更快。我创建了100万个样本随机数据,就像你上面提到的那样,并为你的代码计时。在我的Mac电脑里花了77秒,顺便说一句,这是一台超高速的电脑。 使用numpy而不是shlex拆分字符串只需5秒的处理过程。在
我做了几次测试,看起来效果不错,速度快了14倍。 我希望有帮助。在
相关问题 更多 >
编程相关推荐