重叠分割和合并大的文本文件



我有一个大文件(100 GB以上)。我想并行处理它。我想拆分它,这样第一个文件将包含第0行到1001 M,第二个文件将包含从1000 M到2001 M等。在我处理文件之后,我在每两个结果之间有n条重叠的线(n是有界的,但不是恒定的)。让我们假设n的范围在100- 900k行之间。重叠只能发生在行级)是否有一些方法来实现这个任务,或者我必须写分割和合并使用C?

听起来你是在重新发明轮子

Map/Reduce及其在Hadoop中的实现正是为了"我有一个大文件(100gb以上)"而发明的。我想并行处理它。"

自从Hadoop被发明以来,大数据工具箱中又增加了很多新功能。我建议你研究一下spark或者python-spark,如果你喜欢C语言,那么你可能会喜欢python。在我看来,这是很自然的下一步(如果不是c++的话)。

否则,可以使用bash将三个命令堆叠在流中,将头和尾附加到输出流中,从而完成文件分割。您必须在每个步骤中进行二进制分割,基本上是在每个步骤中将文件减半。这个命令变得相当复杂,但我以前做过,它确实有效。只是不要指望你编写的代码能被其他人理解,否则会变得非常非常混乱。我建议不要从事这种工作,而是使用已经经过测试和验证的东西,例如Hadoop

下面是使用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_ffile_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

最新更新