2017-02-06 2 views
3

Я работаю над большими данными, я пытаюсь распараллелить свои функции процесса. Я могу использовать несколько потоков и обрабатывать каждый пользователь другой темы (у меня есть 200k пользователей).bash append файл из нескольких потоков

Каждый поток должен добавить первые строки n файла, которые производят в выходном файле, совместно используемый всеми потоками.

Я написал программу на Java, что выполнение head -n 256 thread_processed.txt >> output (каждый поток будет делать это)

мне нужен выходной файл, который будет написал слитно.

Если поток A написал строки от 0 до 9, а потоки B составили строки от 10 до 19, выход должен быть: [0...9 10... 19]. Строки не могут перекрываться, это не может быть что-то вроде [0 1 2 17 18 3 4 ...]

Как я могу управлять одновременным доступом для записи к выходному файлу в сценарии bash?

+1

Ваш код Java нужно записать вывод каждого потока в отдельный файл, так что другой поток может объединить их в правильный заказ. Вам не понадобятся все потоки для конкатенации вывода из первых потоков 'k', но вам нужно выполнить первый« k ». – chepner

+0

Сделайте мега-хак и используйте 'sed', чтобы писать на определенную строку. Но сирисло, если вы знаете, как сделать заказ, как предложил chepner или префикс строк с номером и отсортировать их. – bliof

+0

пс. или сделать линии одинакового размера, и вы сможете легко их поместить в правильные вещи из java – bliof

ответ

2

sem из GNU Параллельно должны быть в состоянии сделать это:

sem --id mylock "head -n 256 thread_processed.txt >> output" 

Он начнет мьютекс по имени mylock.

Если вы обеспокоены тем, что кто-то может прочитать output в то время как head работает:

sem --id mylock "cp output o2; head -n 256 thread_processed.txt >> o2; mv o2 output" 
Смежные вопросы