我有一个大文件(100 GB +)。 我想并行处理它。我想拆分它,所以第一个文件将包含0到1001 M行,第二个文件从1000 M到2001 M等。 处理文件后,我在每两个结果之间有n条重叠线(n有界但不是常数。让我们假设n可以在100-900 k行之间。重叠只能在行级别发生) 有什么方法可以实现这个任务,还是我必须使用C编写拆分和合并?
答案 0 :(得分:1)
听起来你正试图重新发明轮子
Map / Reduce,它在Hadoop中的实现是为了“我有一个大文件(100 GB +)而发明的。我想并行处理它。”
自Hadoop发明以来,bigdata工具箱已经有很多新增功能。我建议你看看spark和python-spark,如果你喜欢C,那么你可能会喜欢python。在我看来,这是非常自然的下一步(如果不是C ++的话)。
否则,通过在输出流附加tee和head的流中堆叠tail命令,可以使用bash完成拆分文件。您必须在每个步骤中进行二进制拆分,基本上将每个步骤中的文件减半。命令变得相当复杂,但我之前已经完成了它并且确实有效。只是不要指望你生产的代码可以被其他人理解,它会非常混乱。我建议不要继续这项工作并使用已经过测试和验证的内容,例如Hadoop
答案 1 :(得分:0)
以下是使用awk将文件拆分为重叠块的一种方法:
BEGIN { file_f = -1 } # initialise file suffix
{ l = NR % 20 } # 20 is the repeat length
l == 1 { f = 1; file_f += 2 } # f is set for lines 1 to 12, inclusive
l == 13 { f = 0 }
l == 11 { g = 1; file_g +=2 } # g is set for lines 11 to 2, inclusive
l == 3 { g = 0 }
f { print >"file_"file_f }
g { print >"file_"file_g }
标志f
处理"奇数"块和g
处理"偶数"那些。每个新块的file_f
和file_g
后缀加2,导致连续编号的输出文件。
在一个小例子上测试这个(注意awk中的行号从1开始):
$ seq 22 > file
$ awk -f script.awk file
$ cat file_1
1
2
3
4
5
6
7
8
9
10
11
12
$ cat file_2
11
12
13
14
15
16
17
18
19
20
21
22
$ cat file_3
21
22