Я использую s3fs read_block
для равномерного распределения CSV по нескольким процессам. Каждый процесс должен иметь диапазон байтов для работы и работы независимо от других. Каждая строка в csv должна обрабатываться без наложения.
Проблема в том, что начало и конец диапазонов байтов вряд ли будут началом и концом строк. Так что некоторые строки могут быть отрублены.
Например-
Мой CSV выглядит так -
beer\npizza\nwings
И я хочу обработать это кусками по 9 байт. Для диапазона байтов 0-9 я получу «пиво». А для диапазона байтов 10-16 я получу «крылья». Я никогда не получу "пиццу", потому что раскол существует в середине строки
beer\npizza\nwings
__________^_______
Что мне нужно, так это какой-то взгляд. Где я хочу получить байты между 0-9 и любые дополнительные байты, необходимые для формирования следующей строки. Тогда мои результаты будут beer\npizza
, wings
.
Является ли взгляд в будущее правильным взглядом на это или есть другое решение? Если прогноз является правильным способом сделать это, можно ли это сделать с помощью s3fs, или мне нужна специальная реализация, чтобы сначала выполнить этот прогноз, чтобы найти правильный диапазон байтов?
Edit:
Пример пользовательской реализации:
if self._lookahead:
self._logger.debug('Performing lookahead')
"""Use lookahead to find next newline in csv"""
self._logger.debug(f'{end - 1}, {self._lookahead + 1}')
r = s3.read_block(self._s3_path, end - 1, self._lookahead + 1)
if '\n' not in (r[0], r[1]):
"""Range ends in the middle of a line. Look ahead for the next newline"""
read_length = read_length + r.index(b'\n')
self._logger.debug(f'New end found {read_length}')