【发布时间】:2020-06-05 21:03:15
【问题描述】:
我正在处理一些大型音频文件 (~500MB),其中涉及大量处理和转换。其中一个步骤涉及写入文件,通过网络发送文件,然后在到达时读取文件,然后根据某些逻辑保存文件。 由于网络部分对我来说无关紧要,我想知道什么是更快或更高效,读写实际文件,或像对象一样的 io 文件。
此外,性能差异有多大(如果有的话)。
我的直觉会说 io 对象会更有效率,但我不知道这两个过程是如何工作的。
【问题讨论】:
我正在处理一些大型音频文件 (~500MB),其中涉及大量处理和转换。其中一个步骤涉及写入文件,通过网络发送文件,然后在到达时读取文件,然后根据某些逻辑保存文件。 由于网络部分对我来说无关紧要,我想知道什么是更快或更高效,读写实际文件,或像对象一样的 io 文件。
此外,性能差异有多大(如果有的话)。
我的直觉会说 io 对象会更有效率,但我不知道这两个过程是如何工作的。
【问题讨论】:
io 类文件对象已被创建以避免创建您不想存储的临时文件,只是为了能够传递给其他模块并“愚弄”它们相信它们是实际的文件句柄(有一些限制,但大多数情况下都可以)
所以是的,使用io.BytesIO 对象会更快,即使使用 SSD 驱动器,读取/写入 RAM 也会胜出。
类 io.BytesIO([initial_bytes])
使用内存字节缓冲区的流实现。
现在如果数据非常大,你就会内存不足或者会出现交换机制。所以你可以存储在内存中的数据量是有限制的(我记得旧的音频编辑软件能够做到“直接到磁盘”正是因为这个原因:当时内存是有限的,这是不可能的在内存中存储几分钟的音频数据)
【讨论】: