У меня есть большой (~ 100 ГБ) текстовый файл, структурированный следующим образом:
A,foobar
A,barfoo
A,foobar
B,barfoo
B,barfoo
C,foobar
Каждая строка представляет собой пару значений, разделенных запятыми. Файл сортируется по первому значению в паре. Линии имеют переменную длину. Определите группу как все строки с общим первым значением, т. е. в приведенном выше примере все строки, начинающиеся с «А», будут группой, а все строки, начинающиеся с «В», будут другой группой.
Весь файл слишком велик, чтобы поместиться в память, но если вы взяли все строки из любой отдельной группы, они всегда поместятся в память.
У меня есть процедура для обработки одной такой группы строк и записи в текстовый файл. Моя проблема в том, что я не знаю, как лучше всего читать файл по группе за раз. Все группы произвольного неизвестного размера. Я рассматривал два пути:
1) Сканировать файл с помощью BufferedReader
, накапливая строки из группы в строку или массив. Всякий раз, когда встречается строка, принадлежащая новой группе, удерживайте эту строку во временной переменной, обрабатывая предыдущую группу. Очистите аккумулятор, добавьте временную, а затем продолжите чтение новой группы, начиная со второй строки.
2) Сканировать файл с помощью BufferedReader
, всякий раз, когда встречается строка, принадлежащая новой группе, каким-то образом сбрасывать курсор, чтобы при следующем вызове readLine()
он начинался с первой строки группы, а не со второй. Я просмотрел mark()
и reset()
, но для этого нужно знать позицию байта начала строки.
Я собираюсь пойти с (1) на данный момент, но я был бы очень признателен, если бы кто-нибудь мог предложить метод, который меньше пахнет.