2014-04-03 49 views
4

我試圖找到一種有效的方式來讀取一個非常大的文本文件(約2,000,000行)。這些線中約90%(實際上最後90%)具有三列格式,並用於存儲稀疏矩陣。從一個大的文本文件到Python的稀疏矩陣

這是我做的。首先,我處理文件的前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[23] 
'   5   11 8.320234929063493E-008\n' 

我曾嘗試過矩陣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]) 

阿蘭

+0

「要從字符串列表轉到數組」您希望做什麼?你想在存儲器中保存矩陣(列表的列表)? –

+0

我希望能夠訪問我的列表中的每個數值並獲取關聯的(nx3)矩陣。 – Alain

+0

你能以某種方式修改文件的格式嗎?因爲它聽起來像HDF5完美配合。 –

回答

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倍。 我希望它有幫助。

+0

太棒了!的確更快,似乎工作得很好。謝謝 ! – Alain

+0

我猜想由於這個圖書館的目標,這個問題本來可能很糟糕,它確實很好,但不是爲了這個目標。 –

2

當你與這個大量的數值數據的工作,你確實應該有工作Numpy,而不是純Python。這通常比速度快10倍以上,並允許您訪問Matlab風格的複雜計算。我現在沒有時間轉換代碼(並且它最容易有一個示例文件),但是確保閱讀文件的第二部分可以使用numpy.loadtxt快速高效地完成。你跳過第一部分,轉換成浮動代碼的整個第二部分大概可以用做事情是這樣的:

A, B, C = np.loadtxt('MY_TEXT_FILE.TXT', skiprows = cpt, unpack = True) 

您可能需要與數據格式播放(通過添加dtype = (int, int, float)左右,不要」不知道如何做到這一點),因爲我猜前兩列是整數。

另請注意,numpy有一個sparse matrix數據類型可用。

+0

感謝這個提議。但是,這意味着RAM存儲器的大量消耗(類似於Matlab中的** importdata **函數)。我試圖避免這一點。儘管如此,速度更快。 – Alain

+0

內存是否對您來說是一個大問題?因爲我無法想象任何事情比這更快 –

+0

內存消耗實際上是我嘗試在這種閱讀操作中使用Python的原因。 Matlab中的** importdata **命令有時可能需要太多的RAM。目前的解決方案並不是非常緩慢,但我想確保我沒有明顯的改善。謝謝 ! – Alain