2013-11-03 84 views
0

我有一個非常大的LIBSVM格式的文​​件(150GB),其中每一行是像下面這樣的大LIBSVM格式的文​​件:分裂用命令行工具

-1 430018:1 429765:1 428103:1 428954:1 430172:1 427300:1 429485:1 432367:1 427059:1 426870:1 426556:2

(第一個標記是標記,其他是特徵:值對)。

我在Python寫了一個程序,以此轉換成[標號,功能ID的[數組],[值]的數組]如:

[-1,[430018,429765,428103,.. 。],[1,1,1,...]]

但它在Python中運行速度非常慢(我在3小時內只能處理10GB文件)。

有沒有一種方法可以獲取此文件並將格式更改爲[標籤,[數組的特徵ID],[數組值]]並將其寫入另一個文件?

對於參考,這裏是Python腳本我寫的每一行轉換:

def convert(f, line) 
     l = line.strip().split(" ") 
     label = int(l[0]) 
     x = [map(int, f.split(":")) for f in l[1:]] 
     x_idx, x_val = zip(*x) 
     f.write(str([label, x_idx, x_val])+"\n") 
+0

只是爲了確認,如果f中的參數只轉換一個文件指針? – ChrisProsser

+0

我可以問在這之後會發生什麼?我不禁想知道更像是字典的東西,例如每個功能的值或計數可能會更有用? – ChrisProsser

+0

@ChrisProsser實際上在我原來的代碼中,我不發送f作爲參數,我將x_idx,x_val,label從函數返回並寫入main中的文件。爲了完整的代碼,我只是將f添加到函數參數中。 – user2779485

回答

0
sed -u --posix " 
s/^\([^ ]*\) \{1,\}\(.*\)$/[\1,[,\2 ][/ 
:peer 
s/,\([[:digit:]]\{1,\}\):\([[:digit:]]\{1,\}\) \(.*\)$/,\1,\3,\2/ 
t peer 
s/\[,/[/g 
s/,]/]/g 
s/$/]/ 
" yourfile 

的-u是對這種巨大的文件的強制性。 --post用於GNU sed

-i如果直接修改,如果沒有重定向它。

我不知道這樣的文件的性能。如果速度太慢,仍然可以嘗試其他性能更高效但可能更難以定義的性能。