Python read() 和 write() 在大块/内存管理中



我正在编写一些python代码,可以在不同的点将大文件拼接在一起。我在 C 中做了类似的事情,我分配了一个 1MB 的字符数组并将其用作读/写缓冲区。这很简单:将 1MB 读入 char 数组,然后将其写出。

但是对于python,我假设它是不同的,每次我调用大小= 1M的read()时,它都会分配一个1M长的字符串。希望当缓冲区超出范围时,我们将在下一个 gc 传递中释放它。

python会以这种方式处理分配吗?如果是这样,常量分配/取消分配周期的计算成本是否很高?

我可以告诉 python 像在 C 中一样使用相同的内存块吗?还是 python vm 足够聪明,可以自己做?

我想我本质上的目标是有点像 python 中 dd 的实现。

搜索网站 docs.python.org readinto,以查找适合您正在使用的 Python 版本的文档。 readinto是一个低级功能。 它们看起来很像这样:

阅读(b) 将最多 len(b) 字节读入字节数组 b 并返回读取的字节数。

与 read() 一样,可以向底层原始流发出多个读取,除非后者是交互式的。

如果基础原始流处于非阻塞模式,并且当前没有可用数据,则会引发 BlockingIOError。

但不要过早地担心它。 Python以凶猛的速度分配和解分配动态内存,并且重复获取和释放可怜的兆字节的成本很可能会在噪音中丢失。 请注意,CPython 主要是引用计数的,因此当缓冲区超出范围时,它将"立即"回收。 至于Python是否每次都会重用相同的内存空间,几率不错,但不能保证。 Python没有做任何事情来强迫它,但是根据整个分配/解除分配模式和系统C malloc()/free()实现的细节,它并非不可能被重用;-)

最新更新