s3fs read_block с разделителем - PullRequest
1 голос
/ 28 марта 2019

Я использую 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}')
...