2015-05-27 3 views
2

У меня есть большой файл (100 ГБ +). Я хочу параллельно обрабатывать его. Я хочу разбить его так, чтобы первый файл содержал строки от 0 до 1001 М второй файл от 1000 М до 2001 М и т. Д. После обработки файлов у меня есть n перекрывающих друг друга строк между каждыми двумя результатами (n ограничено, но не является константой. предположим, что n может находиться в пределах между 100-900 k строк. Наложение может происходить только в линейном уровне) есть какой-то способ достичь этой задачи или мне нужно написать разбиение и слияние с помощью C?Перекрытие разделения и слияния большого текстового файла

+2

Было бы гораздо полезнее, если бы вы показали нам небольшой пример того, что вы хотите сделать (и желательно, ваша попытка сделать это). Конечно, полезно знать, что вы намереваетесь работать с гораздо большими файлами, но принципы, вероятно, будут похожи. –

ответ

1

Похоже, вы пытаетесь заново изобретать колесо

Map/Reduce и его реализация в Hadoop была изобретена именно «У меня есть большой файл (100 ГБ +). Я хочу, чтобы параллельно процессу его. "

С момента изобретения Hadoop было добавлено много дополнений к панели инструментов bigdata. Я бы предложил вам посмотреть spark и, возможно, python-spark, если вам нравится C, то вам, вероятно, понравится python. На мой взгляд, это совершенно естественный следующий шаг (если не C++).

В противном случае файлы разбиения могут быть выполнены с помощью bash путем укладки команд tee в потоках с head и tail, прикрепленных к выходным потокам. Вам нужно будет сделать двоичный раскол на каждом шаге, в основном, на половину файла на каждом шаге. Команда становится довольно сложной, но я сделал это раньше, и она работает. Просто не ожидайте, что код, который вы создаете, будет понятен кому-то другому, он становится очень грязным. Я бы посоветовал против persuing эту линию работы и использовать то, что уже было проверено и доказано, такие, как Hadoop

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 
Смежные вопросы