0

我有一个非常大的 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 中编写了一个程序,将其转换为 [label, [array of feature ids], [array of values]],例如:

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

但它在 Python 中运行速度极慢(我只能在 3 小时内处理 10GB 文件)。

有没有办法获取这个文件并将格式更改为每行的 [label, [array of feature ids], [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")
4

1 回答 1

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 对这种巨大的文件是强制性的。--posix 用于 GNU sed

-i 如果直接修改,如果不重定向。

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

于 2013-11-03T19:55:11.130 回答