ZIK1337
@ZIK1337

Многопоточная работа с одним файлом, как лучше сделать?

Есть файл, требуется, чтобы первый поток брал первую строку, следующий - вторую и т.д., пока файл не кончится. Ограничение на потоки конечно есть, то есть если файл из 1000 строк, максимум потоков 200, то когда 200 потоков уже работают, новые строки не брать, пока хотя бы один поток не завершит работу, и соответственно следующий поток берет уже 201-ю строку.

А в другом случае нужно брать рандомную строку из файла, и если файл кончился (допустим 200 строк и 200 потоков уже работают), то следующий поток ожидает, пока какой-то поток не завершит работу, и после этого берет освобожденную строку файла.

Какими способами это лучше организовать?
  • Вопрос задан
  • 422 просмотра
Пригласить эксперта
Ответы на вопрос 1
@acwartz
Тут должна быть ваша реклама.
Такое кол-во потоков избыточно. Файл можно открыть как stream и влезть в абсолютно любую его часть, таким образом работать с ним как с массивом байт разбитым на блоки.

Вот и поделите размер в байтах на N потоков и передайте эти смещения потокам. Первый читает с нуля и признает конец строки равный nul-символу/либо иной другой line-ending типа LF/CRLF, остальные ищут #0 от начала блока и начинают читать данные вплоть до границы своего блока.

Понятное дело что строки будут порваны. Тут уж фантазия на выгул. Можно собрать и обработать в конце.
Если при чтении блока конец строки не достигнут, поток сообщает этот кусок незавершенной строки и начало строки (смещение в файле) менеджеру пула, строки складываются по возрастанию смещения от 0.
Если чтение блока начато не от начала смещения, т.е. нашли чей-то хвост, его так же передают менеджеру.
В конце, менеджер последнему потоку передает необработанные части на доработку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы