PythonXML快速计数具有特定标记的元素数

PythonXML快速计数具有特定标记的元素数,python,xml,parsing,split,xml.etree,Python,Xml,Parsing,Split,Xml.etree,我不久前刚刚开始用Python编程,目前正在处理一个非常大的数据集。它是一个xml文件,大小约为80GB,因此我不能仅用xml.etree.ElementTree解析它,因为它根本不适合我的RAM。(文件:,请参阅match_complete.xml.gz) 到目前为止我所做的是:我对它进行了深入研究,总是在找到我要查找的内容后立即清理当前元素和它的根,这非常有效(需要不到10MB的RAM) 我现在要做的是并行解析,因为我有10个内核和20个线程供我使用。为了做到这一点,我计划将这个大xml文件

我不久前刚刚开始用Python编程,目前正在处理一个非常大的数据集。它是一个xml文件,大小约为80GB,因此我不能仅用xml.etree.ElementTree解析它,因为它根本不适合我的RAM。(文件:,请参阅match_complete.xml.gz)

到目前为止我所做的是:我对它进行了深入研究,总是在找到我要查找的内容后立即清理当前元素和它的根,这非常有效(需要不到10MB的RAM)

我现在要做的是并行解析,因为我有10个内核和20个线程供我使用。为了做到这一点,我计划将这个大xml文件拆分为20个较小的文件,这样我就可以并行地在每个小文件中开始搜索(这可能是另一个线程中的第二个问题)

由于我不仅尝试对一个数据集执行此操作,该数据集的大小我可以轻松查找(请参见上面链接中的release_notes.txt),而且我希望这是一个更通用的脚本,以供进一步使用,因此我正在寻找最有效的方法来找出这个巨大的xml文件中有多少具有特定标记的元素,因此,我总是可以根据可用线程数拆分文件

数据结构如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE interpromatch SYSTEM "match_complete.dtd">
<interpromatch>

<release>
    <dbinfo Here is stuff I am totally not interested in>
    <dbinfo Here is stuff I am totally not interested in>
</release><protein id="A0A000" name="A0A000_9ACTN" length="394" crc64="F1DD0C1042811B48">
<match id=Some info about the proteins in my case>
  <ipr Some info I am acutally looking for, when I am parsing the file ESSENTIAL />
  <Don't need this either />
</match>
    <match id=Some info about the proteins in my case>
  <ipr Some info I am acutally looking for, when I am parsing the file ESSENTIAL />
  <Don't need this either />
</match>
<match id=Some info about the proteins in my case>
  <ipr Some info I am acutally looking for, when I am parsing the file ESSENTIAL />
  <Don't need this either />
</match>
</protein>
.
.
. (around 50000000 more entries in the whole db)
<protein>
<match id=Some info about the proteins in my case>
  <ipr Some info I am acutally looking for, when I am parsing the file ESSENTIAL />
  <Don't need this either />
</match>
</protein>
</interpromatch>

假设我正在寻找标签“蛋白质”,我的数据库包含10000个这样的条目。我希望能够尽可能快地查找这个数字(我认为迭代是不可行的),这样我就可以找出其中有多少个条目,并将这个数字除以线程数。在这个例子中,我想得到例如len(tree.findall(“protein”)),这样我就知道有多少条目需要放入一个较小的文件中。在这种情况下,每个文件将有10000(蛋白质)/20(线程)

我主要使用Python,但是我会考虑所有的事情,这只是告诉我,我的数据库中有多少“蛋白质”条目尽可能快地存在。

为了完整性起见,我稍后要做的是: 为每个较小的文件启动一个脚本/子流程,并在“ipr”部分查询该脚本/子流程中的某个属性。在那里,我正在寻找某个标识符,如果这个标识符存在,则从父“蛋白质”节点提取数据。将这些结果结合起来,并与这些结果一起工作


我希望你明白我的意思,能帮助我。提前谢谢

这里没有魔弹。。。您绝对必须以这样或那样的方式进行iterparse,如果您真的想要更好的性能,您应该从python之外寻找,因为有了这么多的分配/解除分配,python解决方案将非常缓慢。我同意这里的评论。我很难看到您如何在不重复的情况下实现这一点。即使有一个内置的方法,它也可能只是遍历所有东西,就像
if x in y
过程一样。你说这是不可行的,但你有没有试过,并计时,看看它是否可以接受?或者,若你们知道你们将需要一个类似的过程很多时间,你们可以花费额外的计算时间来创建某种索引,然后稍后再进行投票。但基本上是一样的。不知道你在期待什么。谢谢你的回答。这就是为什么我说,我真的不在乎,哪种编程语言是这里最快的,我只想要这一个结果,这在任何编程语言中都应该是可行的。我真的在寻找最快的方法,得到这个数字,没有别的。我已经考虑过的另一件事是,如果我得到的块太多,只需将文件分割成非常小的块,然后将它们重新添加到一起。但我想这会浪费更多的资源。100万个序列的计数需要6分钟。这意味着整个数据集大约需要300分钟,而这又意味着需要等待5个小时才能出现一个数字。这对我来说似乎有点太长了。我曾希望有一种真正快速的xml解析器,它可以运行文件并计算项目,而无需做太多的额外工作。