Cython / Python:大型数据集内存问题和设置操作加速

时间:2014-09-24 12:49:12

标签: python transactions cython

我有一个包含大量事务/行的文件。每个事务/行包含不同数量的唯一项/值。每个事务的项/值由空格分隔。因此,事务(即文件的每一行)具有以下形式:

a b c d e
b c d
. . .

其中项目a,b,...,e可以是任何东西,从字符串到数字。 为简单起见,我们假设这些项目只是字母。

我想读取此文件,将其保留在内存中,并对每个事务使用set操作。 现在,我正在阅读文件,我正在创建一个集合列表。 我将每个事务转换为一个集合,因为我想使用issubset()函数,一般是set操作。问题是,如果文件太大,那么我得到一个MemoryError。

我使用Cython来声明一个C-struct,以减少内存使用量。在这个结构中,我将行数和数据集保存在char **中。我设法解决了内存问题,但后来我遇到了set操作的问题。具体来说,我实现了一些函数,它们以相同的方式使用字符串,因为相应的集合操作与集合一起工作。但是,这给了关键的时间开销。

所以我的问题包括两部分: a)是否有另一种方法可以减少存储数据集所需的内存,同时保持集合功能?
b)否则,如果我使用C-struct处于正确的轨道上,有没有办法在Cython中使用字符串加速设置操作? *

- 编辑 -

***我已经在C中实现了这些功能并将它们放在头文件中。然后我用

cdef extern from "header_name.h":
    ...

1 个答案:

答案 0 :(得分:0)

你可以使用反向方法吗?

即,不要保留集合列表,而是保留集合字典。在该字典中,键是一个条目,值将是此条目出现的行。

E.g。如果你有这个:

row 1:  a b c d e
row 2:  a b 33 2

在两行之后你的字典会是这样的:

a -> set(1,2)
b -> set(1,2)
c -> set(1)
d -> set(1)
e -> set(1)
33 -> set(2)
2 -> set(2)

在遍历所有行之后,字典的每个条目都将包含它出现的所有行的数字。 (您实际上可以使用bitset i / o set来节省一些空间)。然后,您可以使用此结构查看哪些行相交。