Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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
FreeBSD上的Python字符串内存使用情况_Python_Malloc_Freebsd - Fatal编程技术网

FreeBSD上的Python字符串内存使用情况

FreeBSD上的Python字符串内存使用情况,python,malloc,freebsd,Python,Malloc,Freebsd,我观察到了一种奇怪的内存使用模式,python字符串处于打开状态 Freebsd。考虑 下一届会议。这个想法是创建一个列表,其中包含一些 字符串,使列表中的累积字符数为100MB l = [] for i in xrange(100000): l.append(str(i) * (1000/len(str(i)))) 这会像预期的那样使用大约100MB的内存,“del l”将清除这些内存 l = [] for i in xrange(20000): l.append(str(i

我观察到了一种奇怪的内存使用模式,python字符串处于打开状态 Freebsd。考虑 下一届会议。这个想法是创建一个列表,其中包含一些 字符串,使列表中的累积字符数为100MB

l = []
for i in xrange(100000):
    l.append(str(i) * (1000/len(str(i))))
这会像预期的那样使用大约100MB的内存,“del l”将清除这些内存

l = []
for i in xrange(20000):
    l.append(str(i) * (5000/len(str(i))))
这是使用165MB内存。我真的不明白你在哪里 额外的内存使用量来自。[两个列表的大小相同]

FreeBSD7.2上的Python 2.6.4。在Linux/windows上,两者都使用 仅100mb内存

更新:我正在使用“ps aux”测量内存。可以在上述代码片段之后使用os.sytem执行。这些都是单独执行的

Update2:看起来像是freebsd mallocs内存的2倍。因此,分配5KB实际上是分配8KB。不过我不确定。

答案可能在。我认为您正在目睹一些不可避免的内存管理器开销


正如@Hossein所说,试着在一次运行中执行两个代码片段,然后交换它们。

在我看来,这可能是内存中的片段。首先,大于255字节的内存块将在CPython中用malloc分配。你可以参考

出于性能原因,大多数内存分配(如malloc)将返回对齐的地址。例如,你永远不会得到像这样的地址

0x00003
它没有按4字节对齐,计算机访问内存的速度会非常慢。因此,malloc获得的所有地址都应该是

0x00000
0x00004
0x00008
等等。4字节对齐只是基本的通用规则,真正的对齐策略是OS变量

你所说的内存使用应该是RSS(不确定)。对于大多数操作系统,虚拟内存的页面大小是4K。对于您分配的内容,您需要2页来存储5000字节的块。让我们看一个例子来说明一些内存泄漏。我们假设这里的对齐是256字节

0x00000 {
...       chunk 1
0x01388 }
0x01389 {
...       fragment 1
0x013FF }
0x01400 {
...       chunk 2
0x02788 }
0x02789 {
...       fragment 2
0x027FF }
0x02800 {
...       chunk 3
0x03B88 }
0x03B89 {
...       fragment 3
0x04000 }

正如您所看到的,内存中有太多的片段,它们无法使用,但它们仍然占用了页面的内存空间。我不确定FreeBSD的对齐策略是什么,但我认为这是由这样的原因造成的。为了在Python中高效地使用内存,您可以使用一大块预先分配的内存,并选择一个好的数字作为要使用的内存块(您必须测试以知道哪个数字最好,这取决于操作系统)。

我认为freebsd中的所有内存地址都必须与二的幂对齐。因此,所有python的内存池都在一定程度上被分割到内存中,而不是连续的


试着用其他方法找出任何有趣的东西

先执行第二段代码,然后执行第一段代码怎么样?我再次认为它将是165MB,因为这与操作系统/python解释器和垃圾收集器如何管理内存有关。您如何确定它使用的内存?你确定这是对的吗?