[英]How To Create a Python file-like Object from an Iterator
我正在使用來自boto3
客戶端的upload_fileobj
function 作業測試從 python glue
shell 作業寫入S3
的吞吐量。 這個 function 的輸入是
Fileobj(類文件對象)——要上傳的類文件 object。 至少,它必須實現 read 方法,並且必須返回字節。
為了讓測試僅隔離吞吐量,而不是 memory 或 CPU 功能,我認為使用 upload_file_object 的最佳方法是傳遞一個iterator
,該迭代器產生N
個字節的值0
。
在 python 中,如何從迭代器創建“類文件對象”?
我正在尋找某種形式的東西
from itertools import repeat
number_of_bytes = 1024 * 1024
zero_iterator = repeat(b'0', number_of_bytes)
file_like_object = something(zero_iterator) # fill in 'something'
然后將其傳遞給 boto3 進行編寫
session.client('s3').upload_fileobj(file_like_object, Bucket='my_bucket')
預先感謝您的考慮和回復。
這是https://stackoverflow.com/a/70547492/1319998答案的簡化版本,因為我們只需要處理bytes
,因此應該適合 boto3 的upload_fileobj
def to_file_like_obj(iterable):
chunk = b''
offset = 0
it = iter(iterable)
def up_to_iter(size):
nonlocal chunk, offset
while size:
if offset == len(chunk):
try:
chunk = next(it)
except StopIteration:
break
else:
offset = 0
to_yield = min(size, len(chunk) - offset)
offset = offset + to_yield
size -= to_yield
yield chunk[offset - to_yield:offset]
class FileLikeObj:
def read(self, size=-1):
return b''.join(up_to_iter(float('inf') if size is None or size < 0 else size))
return FileLikeObj()
如果你有一個產生字節的迭代, my_iterable
說,這可以與 boto3 一起使用,如下所示:
target_obj = boto3.Session().resource('s3').Bucket('my-target-bucket').Object('my/target/key')
target_obj.upload_fileobj(to_file_like_obj(my_iterable)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.