2016-11-30 2 views
2

У меня есть консольное приложение на Swift3, что читать построчно из очень большого file.txt (~ 200GB):Swift многопоточности консольного приложение

guard let reader = LineReader(path: "/Path/to/file.txt") else { return; } 

for line in reader { 
    // do something with each line  
} 

Это занимает около 8+ часов, чтобы прочитать все данные из файла. Мой сервер имеет 6 аппаратных ядер, как читать этот файл в 6 потоках?

LineReader здесь: https://github.com/andrewwoz/LineReader

PS. Файлы с начала разделяются на 1 ГБ на файл.

+0

Обновленный вопрос. –

+6

Шаг 1: не создавайте файлы в формате 200gb – Alexander

+2

Для многопоточности вам потребуется безопасный способ разделения файла на несколько фрагментов, которые будут обрабатываться отдельно. Возможно, это макет вашего файла? – Alexander

ответ

0

!!! Это решение работает только тогда, когда вы читаете файл, используя POSIX FOPEN() как здесь: https://github.com/andrewwoz/LineReader

let reader = LineReader(path: pathToFile) 
var threads = [Thread]() 

func readTxtFile() { 
    while let line = reader?.nextLine { 
    autoreleasepool { 
     // To do with each line 
    }} 
} 

for threadNumber in 0...threadsCount-1 { 
    threads.append(Thread(){ readTxtFile() }) 
    threads[threadNumber].start() 
} 

select(0, nil, nil, nil, nil) 

Кроме того, реальная прибыль время только с аппаратными ядрами, а не с HT нитей. Если ваш процессор имеет 2 ядра и 4 потока, используйте 2 потока в коде.

0

Никогда не думал о многопоточном чтении .txt-файла с 200 гб, но я бы предположил, что консоль обнаружит, сколько ядер (e.x. 6core) доступно и разбито на (e.x. 6parts). (-> Одна часть для каждого процесса) Насколько я знаю, Ubuntu автоматически равномерно распределит процессы. Надеюсь, что это помогло

+0

Than вы. Не могли бы вы помочь, не понимаете, как вы предлагаете выполнить 6 процессов? –

Смежные вопросы