Python networkx-分块读取edgelist(熊猫)
我有一个非常大的网络要在Networkx中读取和分析(大约5亿行),存储在gzip加权的edgelist(Node1 Node2加权)中。到目前为止,我试图通过以下方式阅读:Python networkx-分块读取edgelist(熊猫),python,pandas,networkx,Python,Pandas,Networkx,我有一个非常大的网络要在Networkx中读取和分析(大约5亿行),存储在gzip加权的edgelist(Node1 Node2加权)中。到目前为止,我试图通过以下方式阅读: # Open and Read File with gzip.open(network,'rb') as fh: # Read Weighted Edge List G = nx.read_weighted_edgelist(fh, create_using=nx.DiGraph()) 但是因为它很大,我
# Open and Read File
with gzip.open(network,'rb') as fh:
# Read Weighted Edge List
G = nx.read_weighted_edgelist(fh, create_using=nx.DiGraph())
但是因为它很大,我有一些记忆问题。我想知道是否有一种方法可以沿着固定长度的块读取“pandas”样式的文件。谢谢你的帮助
编辑:
这是我的edgelist文件(Node1 Node2 Weight)的一个小摘录:
将中的数据作为csv读入一个文件:
df = pd.read_csv(path_to_edge_list, sep='\s+', header=None, names=['Node1','Node2','Weight'])
现在创建一个nx有向图并执行列表理解,以生成一个元组列表,其中(node1、node2、weight)作为数据:
In [150]:
import networkx as nx
G = nx.DiGraph()
G.add_weighted_edges_from([tuple(x) for x in df.values])
G.edges()
Out[150]:
[(16328715, 7695005),
(42230925, 1801294),
(40959246, 1100438),
(12737940, 4114680),
(3635610, 2103011),
(16260783, 3373725),
(45999903, 45999903),
(7176482, 3222203),
(8689446, 1977413),
(11561383, 2102983),
(21149725, 17011789),
(18210502, 10816500),
(3291058, 3226104),
(23898296, 1633222),
(46586813, 1599030),
(2060097, 2060091),
(5998987, 3453478),
(44608582, 2295986),
(12420680, 1364416),
(612044, 92878),
(30879005, 5242),
(23192021, 5818064),
(23192021, 5818065),
(1312990, 105320),
(20926179, 2332390),
(26475759, 85310),
(24935102, 737450),
(35151866, 35151866),
(1886716, 1378893)]
证明我们有重量属性:
In [153]:
G.get_edge_data(30879005,5242)
Out[153]:
{'weight': 11}
要在块中读取边缘列表,请在read_csv
中设置chunksize
参数,并使用上述代码为每个块添加边缘和权重
编辑
因此,要分块阅读,您可以这样做:
import networkx as nx
G = nx.DiGraph()
for d in pd.read_csv(path_to_edge_list,sep='\s+', header=None, names=['Node1', 'Node2', 'Weight'], chunksize=10000):
G.add_weighted_edges_from([tuple(x) for x in d.values])
你能发布几行你的边缘列表吗,我以前从dfs加载过NX图形谢谢,只是在问题中添加了一些信息。不用担心,我只是整理了我的代码,您可以只对
df.values
执行列表理解,无需选择列。我应该使用pd.concat
来连接网络中的块,或者仅:用于iter中的块\u csv:G.添加加权的边\u from([tuple(x)用于块中的x.values])
其中iter\u csv=pd.read\u csv(path,chunksize=n)
您可能可以避免这种情况,因为您想要的只是将边缘添加到网络中,所以在读取边缘列表的代码之外定义图形,每次调用read\u csv
创建的df可以重新使用,以保持内存开销较低。因此,请遵循您的代码并添加块,我只是在df:G中为I运行add\u weighted\u edges\u from([tuple(x)for x in I.values])
很抱歉打扰您,但是尽管使用了chunksize方法,我仍然会遇到高内存消耗。您可以添加一个如何为每个块添加边的示例代码吗?谢谢。
import networkx as nx
G = nx.DiGraph()
for d in pd.read_csv(path_to_edge_list,sep='\s+', header=None, names=['Node1', 'Node2', 'Weight'], chunksize=10000):
G.add_weighted_edges_from([tuple(x) for x in d.values])