我正在尝试找到一种有效的方法来读取非常大的文本文件(大约 2,000,000 行)。这些行中大约 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% 提取到一个列表中:
matrix=[]
with open('MY_TEXT_FILE.TXT') as f:
for i in range(cpt):
f.next()
for line in f:
matrix.append(line)
这允许以低内存消耗非常快速地读取文本文件。缺点是 matrix 是一个字符串列表,每个字符串类似于:
>>> matrix[23]
' 5 11 8.320234929063493E-008\n'
我尝试在 matrix 的行上使用迭代过程并结合 shlex.split 命令从字符串列表转到数组,但这是非常耗时。
您知道从字符串列表到数组的快速策略吗?
我想知道是否有比这个过程更快的东西:
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])
阿兰
最佳答案
看,我想出了这个似乎工作得更快的混合解决方案。我创建了一个 100 万样本随机数据,就像您上面提到的那样,并为您的代码计时。顺便说一句,我的 Mac 电脑用了 77 秒,这是一台超快的电脑。 使用 numpy 而不是 shlex 来拆分字符串在 5 秒的处理过程中结束。
A=[0]*len(matrix)
B=[0]*len(matrix)
C=[0]*len(matrix)
for i in range(len(matrix)):
full_array = np.fromstring(matrix[i], dtype=float, sep=" ")
A[i]=full_array[0]
B[i]=full_array[1]
C[i]=full_array[2]
我进行了几次测试,它似乎运行良好,而且速度提高了 14 倍。 希望对您有所帮助。
关于python - 使用 Python 从大型文本文件到稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22839386/