【发布时间】:2019-03-28 14:04:50
【问题描述】:
我正在使用 s3fs read_block 在多个进程中平均分配 csv。每个进程都需要被赋予一个字节范围以独立于其他进程进行操作和工作。 csv中的每一行都需要处理不重叠。
问题在于字节范围的开头和结尾不太可能是行的开头和结尾。所以有些行可能会被砍掉。
例如-
我的 csv 看起来像这样-
beer\npizza\nwings
我想以 9 个字节的块来处理它。对于字节范围 0-9,我会得到“啤酒”。对于字节范围 10-16,我会得到“翅膀”。我永远不会得到“披萨”,因为分割存在于一行的中间
beer\npizza\nwings
__________^_______
我需要的是某种前瞻性。我想在哪里获取 0-9 之间的字节,以及形成下一行所需的任何其他字节。那么我的结果将是beer\npizza、wings。
前瞻是看待这个问题的正确方法还是有其他解决方案?如果前瞻是执行此操作的正确方法,是否可以使用 s3fs 来完成,或者我是否需要自定义实现先执行此前瞻以找到正确的字节范围?
编辑:
自定义实现示例:
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}')
【问题讨论】:
标签: python amazon-s3 distributed-computing