2013-11-03 35 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如果直接修改,如果没有重定向它。

我不知道这样的文件的性能。如果速度太慢,仍然可以尝试其他性能更高效但可能更难以定义的性能。