Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:有效地将字节块连接成一个大块?_Python_Amazon S3 - Fatal编程技术网

Python:有效地将字节块连接成一个大块?

Python:有效地将字节块连接成一个大块?,python,amazon-s3,Python,Amazon S3,我试图操纵陪审团,允许对大文件进行分块处理。现在它会执行一个“self.body=http_response.read()”,因此,如果您有一个3G文件,您将在对其进行任何控制之前将整个内容读入内存 我目前的方法是尝试保持库的接口不变,但在读取每个数据块后提供回调。如下所示: data = [] while True: chunk = http_response.read(CHUNKSIZE) if not chunk: break if callback

我试图操纵陪审团,允许对大文件进行分块处理。现在它会执行一个“self.body=http_response.read()”,因此,如果您有一个3G文件,您将在对其进行任何控制之前将整个内容读入内存

我目前的方法是尝试保持库的接口不变,但在读取每个数据块后提供回调。如下所示:

data = []
while True:
    chunk = http_response.read(CHUNKSIZE)
    if not chunk:
        break
    if callback:
        callback(chunk)
    data.append(chunk)
现在我需要做一些类似的事情:

self.body = ''.join(data)

join是这样做的正确方法还是有其他(更好的)方法将所有块放在一起?

在python3中,
字节
对象不同于
str
,但我不知道为什么会有任何错误。

join
如果真的需要将整个字符串放在一起,看起来很好,但是你最终还是把所有的东西都存储在RAM里了。在这种情况下,我会尝试看看是否有办法处理字符串的每个部分,然后丢弃处理过的部分,因此每次只需要在内存中保留固定数量的字节。这通常是回调方法的要点。(如果一次只能处理一部分数据块,请使用缓冲区作为队列来存储未处理的数据。)

“join()是连接数据块的最佳方法。另一种方法可以归结为重复连接,这是O(n**2),因为字符串是不可变的,并且需要在每次连接时创建更多字符串。给定,如果与+=一起使用,最新版本的CPython会对这种重复连接进行优化,使其成为O(n),但这种优化只会使其粗略地等效于“”。无论如何,join()在字节数上显式为O(n)。

hm-您试图解决什么问题?我怀疑答案取决于你试图如何处理这些数据

由于一般情况下,您不希望在内存中存储整个3Gb文件,因此我不会将块存储在数组中,而是迭代http_响应,并使用适当的文件句柄上的普通write()方法将其直接写入到磁盘中的临时或持久文件中

如果您确实希望内存中有两个数据副本,您的方法将要求假设的3Gb文件至少有6Gb,这可能对大多数硬件都很重要。我知道数组连接方法很快,但由于这是一个真正受ram限制的过程,也许你想找到更好的方法?StringIO()创建可以附加到内存中的字符串对象;纯python的一个,因为它必须处理不可变字符串,只在内部使用数组连接技巧,但是基于c的cStringIO实际上可能会在内部附加到内存缓冲区。我手头没有它的源代码,所以这需要检查

<>如果您确实希望对数据进行某种分析,并希望以最小的开销保持在内存中,那么您可能需要从数值/数字中考虑一些字节数组对象作为StringIO的替代品。它们是针对大型阵列优化的高性能代码,可能正是您所需要的

作为一个有用的示例,对于具有高效内存迭代器友好方法的通用文件处理对象,您可能希望查看django文件对象块处理代码:
.

同意,但我正试图保留现有的API,这需要在内存中保存整个API。理想情况下,正文应该是一个生成器,而不是一块字节,让用户按照自己的意愿处理它……关于需要6GB而不是3 GB的问题,我上面的方法有一个很好的观点。我想处理这些块并去掉它们(在本例中,只需将它们写入磁盘),但我还想保留提供对内存中数据访问的现有语义。我可能不得不放弃后者。