【问题标题】:Concurrent SAX processing of large, simple XML files?大型简单 XML 文件的并发 SAX 处理?
【发布时间】:2014-04-22 08:50:31
【问题描述】:

我有几个巨大的 XML 文件 (10GB-40GB),它们的结构非常简单:只有一个包含多个行节点的根节点。我试图在 Python 中使用 SAX 解析它们,但我必须为每一行做的额外处理意味着 40GB 文件需要一整天才能完成。为了加快速度,我想同时使用我所有的核心。不幸的是,SAX 解析器似乎无法处理“格式错误”的 XML 块,当您寻找文件中的任意行并尝试从那里进行解析时,您会得到这样的结果。由于 SAX 解析器可以接受一个流,我想我需要将我的 XML 文件分成八个不同的流,每个流包含 [行数]/8 行,并用假的开始和结束标签填充。我该怎么做呢?或者 - 有没有更好的解决方案我可能会错过?谢谢!

【问题讨论】:

  • 你能详细说明你的文件结构吗?如果结构不是任意嵌套的,你可能根本不需要解析。
  • Stack Exchange Data Dump XML 格式:...

标签: python xml parsing concurrency sax


【解决方案1】:

您不能轻易地将 SAX 解析拆分为多个线程,并且您不需要:如果您只是运行解析而不进行任何其他处理,它应该在 20 分钟左右运行。专注于对 ContentHandler 中的数据进行的处理。

【讨论】:

  • 看来我弄错了:XML 处理并不是造成瓶颈的原因。相反,它是 SQL 和 Solr 访问,这将需要不同的方法来修复。 (我正在尝试修改 stackdump 以更快地工作。)
【解决方案2】:

我建议的方法是将整个 XML 文件读取为内部格式,然后进行额外的处理。 SAX 应该足够快,可以在一小时内读取 40GB 的 XML。

根据数据,您可以使用 SQLite 数据库或 HDF5 文件进行中间存储。

顺便说一下,Python 并不是真正的多线程(参见GIL)。您需要multiprocessing 模块将工作拆分为不同的进程。

【讨论】:

  • 假设处理可以独立并并行进行,我建议纯粹在内存上工作,而不是从磁盘保存和读取。 SAX 在一个线程上,提取信息片段并排入队列()。多个工作线程将每条信息出列并执行“工作”。
猜你喜欢
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多