了解 NetworkIt 中的内存使用情况

问题描述

我正在使用 3BN+ 边图,因此我非常关注内存消耗。为了对内存消耗进行基准测试,我创建了一个二部图,在图的每一侧都有 10MN 节点,其中所有节点的度数为 1。我看到每条边的内存消耗大约为 0.5KB。这比我从以下信封数学背后的预期要高:

长度为 20MN = 20MN * size(node)的节点数组 所有邻接表占用的总空间 = 10MN * size(node) 所有权重列表占用的总空间 = 10MN * size(node)

因此,对于 8 字节的大小(节点),对于 10MN 边来说,大约为 40MN * 8 字节(0.3GB)。那将是每边 0.03kb。对于这种规模的图表,我看到的是总内存消耗为 4.5GB,或每条边 0.45kb。

我的问题是每个边缘是否需要 0.5kb 的内存消耗,如果是的话,我在上面的数学中遗漏了什么?这是否与预先分配邻接列表的方式有关?

以下是我用来衡量内存使用情况的脚本:

# Usage
# /path/to/this/script.py N_NODES DEGREE

import numpy as np
import networkit as nk
from memory_profiler import profile

EDGELIST_PATH = 'example_graph.edgelist'

def write_edgelist(n=10_000,d=2):
    arrays = []
    for i in range(d):
        x = np.zeros([n,3],dtype=int)
        x[:,0] = range(0,n)
        x[:,1] = range(n,n * 2)
        x[:,2] = np.random.randint(100,size=n)

        np.random.shuffle(x[:,1])
        arrays.append(x)

    final = np.concatenate(arrays)

    np.savetxt(EDGELIST_PATH,final,delimiter='\t',fmt='%i')

@profile
def read_edgelist():
    edgelist_reader = nk.graphio.EdgeListReader(separator='\t',firstNode=0,continuous=False,directed=True
                                                )
    g = edgelist_reader.read(EDGELIST_PATH)


if __name__ == '__main__':
    import sys
    N = int(sys.argv[1])
    D = int(sys.argv[2])

    print(f"Running benchmark for {N=} and {D=}")

    write_edgelist(n=N,d=D)
    read_edgelist()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...