了解 NetworkIt 中的内存使用情况

如何解决了解 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?