我是igraph的初学者。
我有60000个节点和900K边缘的图形数据。我可以使用python-igraph成功创建图形并写入磁盘。我的机器有3G内存。
当我以graphml格式将图形写入磁盘时,内存使用率约为19%;使用write_pickle,使用率上升到50%并花费更多时间。
igraph的这种行为背后的原因是什么?应该何时应该何时使用泡菜格式?
请详细说明。
答案 0 :(得分:1)
Pickle是Python中标准库的序列化程序。这些猜测对我来说很可能:
当igraph开始时,他们不想创建自己的文件格式,因此他们使用了pickle。现在,保存图形的默认行为不是pickle,而是自己的格式。
在graphml中使用igraph保存对象时,库知道什么是重要的,什么不是,并将使用最少的内存。但是,Pickle可以将许多Python对象序列化为字符串,并将列表或字典中的每个对象保存,以防它被重用或具有循环引用。
答案 1 :(得分:1)
酸洗是一种存储任意对象的通用格式,可以引用其他对象,这些对象又可以引用其他对象。因此,当Python腌制一个对象时,它必须跟踪它之前“看到”并序列化的所有对象,以避免陷入无限循环。这可能是酸洗速度较慢(并且使用更多内存)的原因。
使用酸洗的好处是,酸洗表示将保留每个图形,顶点或边缘属性的精确Python类型(假设您使用支持酸洗的类型)。 GraphML不会保留确切的类型,因为没有从Python类型到GraphML类型的明确映射;例如,所有数字属性都将在GraphML表示中转换为双精度,而不管原始属性是Python整数,长整数还是浮点数。