【发布时间】:2012-05-12 13:10:51
【问题描述】:
我正在尝试在 Python 中构建一个算法来过滤大量 RDF 数据。
我有一个包含大约 7 万个项目的列表,格式类似于 <"datum">。
然后我有大约 6GB 的项目(三元组),格式为 <"A"> <"B"> <"C">
我想提取包含第一个列表中任何项目的所有三元组,然后从第一次提取中提取包含任何单个项目的任何三元组(最终效果是形成一个通过一步连接的图的分区到第一个列表中的种子)。
我还没有为此想出一个很好的算法(因为我没有接受过正规的 CS 培训,这对我没有帮助。)
到目前为止,我想出的最好的方法是首先将大列表中的三元组拆分为三个项目列表[<"A">, <"B">, <"C">] 的列表。然后我将其拆分为多个块,并使用多处理来创建进程,这些进程包含完整的小列表和大列表的一部分......
for line in big list:
for item in small list:
if item in line:
bucket.append(line)
这个算法需要相当长的时间。
有没有更快的方法来做到这一点?如果有具体的算法,你可以给我名字,我会想办法实现它。
谢谢!
每个 cmets 的说明:
所有数据项都是字符串。所以小列表可能包含
["Mickey", "Mouse", "Minny", "Cat"],大列表可能是[["Mickey","Pluto","Bluto"],["John", "Jane", "Jim]...]每个大列表三元组中只有一个项目需要匹配小列表中的一个项目才能计数
小列表中的所有项目实际上都是唯一的,所以我没想过将它们转换为集合。不过我会试试的。
我可以创建任何我想要的中间结构。我现在正在尝试使用搁架构建的倒排索引。
【问题讨论】:
-
是否允许在磁盘上构建中间结构?似乎您可以从“倒排索引”中受益,例如 {'A': [('A', B', 'C), ('A', 'X', 'Y')], ... }
-
明确一点,在每个阶段匹配条目的确切标准是什么?所有
<A><B><C>都必须匹配吗?或者只是<A>、<B>或<C>之一?过滤的第二阶段也有点模糊。一些示例数据可能会有所帮助? -
您应该提供一个简短示例,说明第一个列表包含的内容以及您希望结果列表包含的内容。
-
数据是什么?数字?字符串?