Python networkx-分块读取edgelist(熊猫)

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()) 但是因为它很大,我

我有一个非常大的网络要在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())
但是因为它很大,我有一些记忆问题。我想知道是否有一种方法可以沿着固定长度的块读取“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])