【发布时间】:2019-03-07 20:56:20
【问题描述】:
我想在 s3 上读取大型二进制文件的部分内容。 文件格式如下:
Header 1: 200 bytes
Data 1: 10000 bytes
Header 2: 200 bytes
Data 2: 10000 bytes
...
Header N: 200 bytes
Data N: 10000 bytes
我想提取所有标题并将它们保存到文件中。 N 通常是 (1e6->1e8)。
最快的方法是什么?
到目前为止我已经尝试过boto3:
def s3_open(bucket, key):
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
f = obj.get()['Body']
return f
f = s3_open(bucket, key)
nread = 0
while nread < N:
remaining = N - nread
n = min(1000, remaining)
buf = f.read(n * 10200)
# read 200 bytes from each of these n records and write to file
nread += n
当我在本地 PC 上运行它时速度很慢。 f.read() 调用是瓶颈。
【问题讨论】:
-
你试过
multiprocessing吗?通过并行处理,它可以将计算时间提高 64 倍。 -
我很难找出我的 f 变量:botocore.response.StreamingBody 是如何工作的,但我希望它是线程化的。在线程之间共享 f 是否安全?
-
文件大小是多少?您是否尝试过下载文件并在本地完成所有操作?这将大大减少对 S3 进行多次调用的开销,并且可能会更快。