Итак, когда вы обнаруживаете, форматы текстовых файлов плохи для работы с большими объемами данных; они не только больше, чем двоичные форматы, но вы также сталкиваетесь с проблемами форматирования, как здесь (поиск новых строк), и все происходит на намного медленнее (данные должны быть преобразованы в строки). Разница в скорости ввода-вывода между текстовыми форматами и двоичными форматами для числовых данных может быть легко 10-кратной. Но мы пока предположим, что вы застряли в формате текстового файла.
Предположительно, вы делаете это разбиение для скорости. Но если у вас нет параллельной файловой системы, то есть нескольких серверов, обслуживающих несколько дисков, и FS, которая может их координировать, маловероятно, что вы получите значительное ускорение от чтения нескольких MPI-задач из одного файла. поскольку в конечном итоге все эти запросы все равно будут сериализованы на уровне сервера / контроллера / диска.
Кроме того, чтение в больших блоках данных будет происходить гораздо быстрее, чем fseek (), выполняющее небольшие операции чтения в поисках новых строк.
Таким образом, мое предложение состояло бы в том, чтобы один процесс (возможно, последний) прочитал все данные за минимально возможное время и отправил соответствующие строки для каждой задачи (включая, наконец, саму себя). Если вы знаете, сколько строк имеет файл в начале, это довольно просто; Считайте, скажем, 2 ГБ данных, найдите в памяти конец N / P-й строки и отправьте это заданию 0, отправьте заданию 0 сообщение «завершены ваши данные» и продолжайте.