如何高效存储图节点一二度连接的嵌套列表数据以降低内存占用?
高压缩率存储方案推荐
方案1:使用Parquet格式存储(优先推荐)
Parquet是列式压缩二进制格式,原生支持Python嵌套列表/数组结构,相比pickle有3-10倍的压缩率,读写速度也更快,pandas可以直接调用:
# 存储 nodes.to_parquet("graph_nodes.parquet", compression="zstd") # 读取 nodes = pd.read_parquet("graph_nodes.parquet")
- 优势:不需要改动现有DataFrame结构,不用处理嵌套列表的转换,zstd压缩比高且速度快,是结构化嵌套数据存储的首选。
- 优化技巧:如果节点ID都是整数,可以先把Zero、First、Second列里的数值根据ID范围转成
int32甚至int16类型,可进一步降低存储体积。
方案2:拆分为扁平边表存储(极致压缩推荐)
当前用嵌套列表预存连接关系的结构有大量冗余,把结构拆成两张扁平表,存储体积可以降低一个数量级:
- 节点表:仅存储所有唯一节点ID,不存关联关系
- 边表:仅存两列
(source_node, target_node),所有一度连接都用边表表示
# 示例边表结构 edges = pd.DataFrame([ [1,2], [1,5], [2,3], [2,4], [5,6] ], columns=["source", "target"])
- 优势:完全没有嵌套结构的额外开销,空连接天然不需要存储,不需要单独预存二度关系,需要时可以通过边表join一次直接计算,比预存二度关系节省至少50%以上的空间。
- 适用场景:二度关系不需要高频读取、可接受临时计算的场景。
方案3:使用HDF5格式存储(适合超大规模分块读取)
如果DataFrame体量超过内存上限,可以用HDF5格式支持分块读写:
# 存储 nodes.to_hdf("graph_nodes.h5", key="nodes", mode="w", complevel=9, complib="blosc") # 读取 nodes = pd.read_hdf("graph_nodes.h5", key="nodes")
- 优势:支持按需读取部分数据,不需要全量加载进内存,适合TB级数据的存储。
内容的提问来源于stack exchange,提问作者Patrick Nasser
相关产品推荐
相关产品推荐

