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

时间:2013-09-16 00:14:48

标签: python memory-management file-io

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

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

python会以这种方式处理分配吗?如果是这样,常量分配/解除分配周期在计算上是否昂贵?

我可以告诉python使用与C相同的内存块吗?或者python vm足够聪明,可以自己做吗?

我想我的目标是有点像在python中实现dd。

1 个答案:

答案 0 :(得分:9)

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

  

readinto(b)中   将len(b)字节读入bytearray b并返回读取的字节数。

     

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

     

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

但不要过早担心它。 Python以凶猛的速度分配和释放动态内存,并且可能反复获得&amp;在噪音中会丢失一个微不足道的兆字节。请注意,CPython主要是引用计数,因此当它超出范围时,您的缓冲区将立即“立即”回收。至于Python每次是否会重复使用相同的内存空间,可能性不大但不确定。 Python没有尝试强制,但是根据整个分配/解除分配模式和系统C的malloc()/free()实现的细节,它不会被重用; - )< / p>