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

2024-04-25 06:04:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

a b c d e
b c d
. . .

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

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

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

所以我的问题由两部分组成: a) 在保持集合功能的同时,有没有其他方法可以减少存储数据集所需的内存?
b) 否则,如果我对C-struct的理解是正确的,有没有一种方法可以加快Cython中字符串的set操作?*

--编辑--

***我用C实现了这些函数,并将它们放在头文件中。然后我用

^{pr2}$

Tags: 文件数据项目方法函数内存字符串数量
1条回答
网友
1楼 · 发布于 2024-04-25 06:04:41

你能用相反的方法吗?在

也就是说,与其保留集合列表,不如保留集合字典。在该字典中,键将是一个条目,值将是该条目出现的行。在

例如,如果您有这个:

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

两行之后,您的字典将如下所示:

^{pr2}$

在浏览完所有行之后,字典的每个条目都将包含它出现的所有行的编号。(实际上可以使用位集i/o集来节省一些空间)。然后可以使用此结构查看哪些行相交。在

相关问题 更多 >