【问题标题】:Wrapping binary IO包装二进制 IO
【发布时间】:2013-05-22 18:18:22
【问题描述】:

我最初在 IRC 上问过这个问题,但这可能是那里真正得到回答的最糟糕的问题:

如何包装二进制流/缓冲区,而不只是将整个缓冲区读入内存,对其进行操作,然后根据结果创建一个新缓冲区?

具体来说,我说的是原始流是内存中的io.BytesIO 对象或open 设置b(二进制)标志的结果。

我目前的应用是在通过 HTTP 发送每个图像之前以块的形式调整图像的大小(这显然超出了这个问题的范围),但我通常也对如何处理改变的行为感兴趣一个缓冲区而不破坏其接口。

【问题讨论】:

  • 您是在询问 lazy 操作,还是在之后回退流(这样,对于打开的文件,之后调用 read 仍会从头开始读取)?
  • 是的,这样做的目的基本上是避免将巨大的对象拉入内存,然后对整个事物进行操作(所以,懒惰)。我对那种行为生成器的行为很好,每个块只能被读取一次,也就是说,倒带或非顺序块访问并不重要。 (我所说的“块”只是指整体的一部分,不一定是固定大小或包含独立有用的东西。)
  • 哦,另一件事:如果原始流被缓冲并且具有一些与包装器知道如何处理的块大小不同的固定块大小,则可以拉入足够的块来进行处理,甚至如果原始流中的部分块将保留并需要转移到下一次处理迭代。
  • 我会尝试将我的问题正式化一点,等等。

标签: python stream lazy-evaluation


【解决方案1】:

BufferedStream 将包装原始 IO 流,然后可以根据需要由您的 resize 函数读取:

http://docs.python.org/2/library/io.html#buffered-streams

【讨论】:

  • 如果您从缓冲流开始,是否可以将其包装在原始 IO 流中(大概这只会从缓冲流中读取足够多的完整块,以提供请求的原始流视图并处理假设顺序访问原始流,这就是我所关心的)所以你的方法可以使用吗?这有意义吗?
  • 反之亦然……原始 IO 流被缓冲流包裹。否则我认为你的解释是正确的。缓冲流将根据需要管理从底层原始流中读取正确数量的数据。
  • 我的意思是,如果我写的东西不能选择是否通过原始流和缓冲流,使用你的方法听起来像我第一次需要将该缓冲流转换为原始流,以便它可以用缓冲流包装,其中块大小设置为 resize 函数知道如何处理的值。
  • 我认为您需要为您的客户端类添加代码,以便我们可以看到您要执行的操作。
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多