我有一个非常大的libsvm格式文件(150GB),其中每行如下所示:
-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文件)。
有没有办法获取此文件并将格式更改为[label,[feature of feature of data],[array of values]]每行并将其写入另一个文件?
作为参考,这里是我编写的用于转换每行的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 :(得分: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
这种HUGE文件必须使用-u。 --posix用于GNU sed
-i如果直接修改,如果没有重定向。
我不知道这样一个文件的性能。如果太慢,仍然可以尝试其他sed更高效的性能,但可能更难定义。