Skip to main content
 首页 » 编程设计

python之找出还有谁在引用,大数据

2025年04月02日35www_RR

我有 5000 万行数据,例如:

referring_id,referred_id 
1000,1001 
1000,1002 
1001,1000 
1001,1002 
1002,1003 

目标是找到共享传入连接的所有情况,数值示例应该有所帮助:

如果我们要计算1001 的度量,我们可以看到它有来自 1000 的传入连接,所以我们看看还有谁有来自 1000 的传入连接,那就是 1002。 所以结果将是[1002]。

对于 1002,我们可以看到 1000 和 1001 指的是 1002,这意味着我们要查看它们还指代谁;结果为 [1001,1000](1000 表示 1001,1001 表示 1000)。

如果它是较小的数据,我会为每个 referring 存储一组传出连接,然后遍历 referred 并对所有那些进行联合有传入连接。

问题是这不适合内存。

我正在使用 csv 遍历文件并一次处理一行而不是将其加载到内存中,即使我有 16gb ram。

有没有人知道如何处理它?

请您参考如下方法:

你应该给 pandas一试。它使用 NumPy 数组来存储数据。这有助于节省内存。例如,一个整数的大小为 8 个字节,而不是 Python 2 中的 24 个字节或 Python 3 中的 28 个字节。如果数字很小,您可以使用 np.int16 或 np .int32 将每个整数的大小减少到 2 或 4 个字节。

这个解决方案似乎符合您的描述:

s = """referring_id,referred_id 
1000,1001 
1000,1002 
1001,1000 
1001,1002 
1002,1003""" 
 
import csv 
 
import numpy as np 
 
pd.read_csv(io.StringIO(s), dtype=np.int16)  
#  use: df = pd.read_csv('data.csv', dtype=np.int16)  
by_refered = df.groupby('referred_id')['referring_id'].apply(frozenset) 
by_refering = df.groupby('referring_id')['referred_id'].apply(frozenset) 
 
with open('connections.csv', 'w') as fobj: 
    writer = csv.writer(fobj) 
    writer.writerow(['id', 'connections']) 
    for x in by_refered.index: 
        tmp = set() 
        for id_ in by_refered[x]: 
            tmp.update(by_refering[id_]) 
        tmp.remove(x) 
        writer.writerow([x] + list(tmp)) 

connections.csv 的内容:

id,connections 
1000,1002 
1001,1002 
1002,1000,1001 
1003 

根据您的数据,您可能会逃过此劫。如果有很多重复连接,集合的数量和它们的大小可能足够小。否则,您将需要使用一些分块方法。