s3fs read_block与定界符超前吗?

时间:2019-03-28 14:04:50

标签: python amazon-s3 distributed-computing

我正在使用s3fs read_block在多个进程之间平均分配csv。每个进程都需要指定一个字节范围,以独立于其他进程运行和工作。 CSV中的每一行都需要进行处理,而不能重叠。

问题在于字节范围的开始和结束不太可能是行的开始和结束。因此,某些线可能会被切断。

例如-

我的csv看起来像这样-

beer\npizza\nwings

我想以9个字节的块进行处理。对于0-9字节范围,我将获得“啤酒”。对于10-16字节范围,我将获得“机翼”。我永远也不会得到“比萨饼”,因为拆分位于一行的中间

beer\npizza\nwings
__________^_______

我需要某种前瞻性。我想在0-9之间获取字节,以及形成下一行所需的任何其他字节。那么我的结果将是beer\npizzawings

向前看是正确的方式还是有其他解决方案?如果提前查找是执行此操作的正确方法,那么可以使用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}')

1 个答案:

答案 0 :(得分:0)

来自s3fs documentation。您可以简单地将分隔符传递给 read_block() 函数。 希望能帮到你:

     <template>
            <div class="row mb-2">
              <div class="col-md-6" @click="new_customer = true">
                  <button class="btn btn-success btn-md btn-block">New Customer</button>
              </div>
              <div class="col-md-6" @click="new_customer = false">
                  <button class="btn btn-warning btn-md btn-block">Existing Customer</button>
              </div>
            </div>
            <div class="form-group" v-show="new_customer == false">
                <label for="customer_slack">{{ $t("Select Customer") }}</label>
                <select v-model="customer_slack" class="form-control">
                  <option v-for="(customer,index) in customers":key="index" :value="customer.slack">{{ customer.phone }} | {{ customer.email }} </option>
                </select>
            </div>
     </template>

<script>
'use strict';
import { VueSelect } from "vue-select2";

export default {
    components: {
        VueSelect
    },
   data(){
        return{
           customers : (this.customer_data == null) ? '' : this.customer_data,
         }
   },
   mounted() {
   }
}
</script>