То, что вы хотите сделать, не очень легко. Фреймворки, такие как Google MapReduce и Apache Hadoop, были созданы для решения подобных проблем. В общем случае разделение произвольного большого файла для произвольной параллельной обработки является сложной проблемой, и для этой задачи лучше всего использовать специальную инфраструктуру. Но в вашем случае, поскольку у вас, похоже, очень специфические требования, вы можете сделать что-то вроде:
Разделить файл на N кусков (где N = количество ядер). Очевидно, что это не будет учитывать границы строк, поэтому вам понадобится подпрограмма «splitter», которая ищет следующий символ новой строки в каждом чанке. (Это может быть сложно сделать правильно и избежать дублирования, но это в основном то, что делает Hadoop или MapReduce.) Затем вы можете обрабатывать каждый блок параллельно.
Конечно, это может быть неэффективно, как вы думаете. Если весь файл не помещается в памяти, вы столкнетесь с проблемами ввода-вывода. То, что вы распараллеливаете использование процессора, не обязательно означает, что вы распараллеливаете ввод-вывод. Вот почему платформы распределенной обработки обычно также распределяют данные по нескольким жестким дискам или узлам кластера.