1

我有大约 50Gb 长的 xbrl 文件。当我尝试通过 arelle 打开它时,我得到了MemoryError. 有没有办法将 xbrl 文件拆分成更小的部分?xbrl 规范是否支持这一点?

4

2 回答 2

0

没有简单或标准的方法将 XBRL 文件拆分成更小的部分,尽管有一些方法可以做到。您可以将成批的事实复制到单独的文件中,但是这样做时,您需要确保您还复制了引用的上下文和事实的单元定义。由于上下文和单元可能出现在引用它们的事实之前或之后,这使得这一点变得更加棘手,因此您可能需要在多个流解析中执行此操作。

如果您自己生成数据,我建议您查看xBRL-CSV。这是一个新规范,适合以更紧凑的形式表示基于记录的大型 XBRL 数据集。我相信,Arelle 对此有初步的支持。

于 2019-11-14T11:10:58.817 回答
0

让我首先从数据库的角度(与 XBRL 无关)给出一般性评论。

在处理大量数据时,数据管理中的常见做法是将输入拆分为位于同一目录中的多个较小的文件(每个文件最多 100 MB)。这通常用于大型数据集,文件名在同一目录中携带递增的整数。它有实际的原因,使得将数据集复制到其他位置变得更加容易。

但是,我不确定是否有以这种方式拆分 XBRL 实例的公共标准(尽管这对于引擎开发人员来说执行和实现相对简单:只需对事实进行分区并将一个分区写入每个文件只有传递闭包中的上下文和单元——这实际上是标准化完成方​​式的问题)。

然而,对于流友好的查询(例如过滤、投影、计数、转换为另一种格式、 ETC)。

在 XBRL 的情况下,诀窍是按照 pdw 提到的方式以流式方式读取文件的方式构造文件。我建议查看 XBRL International [1] 的以下官方文档,该文档现在是候选推荐,并解释了如何创建可以以流方式读取的 XBRL 实例:

[1] https://specifications.xbrl.org/work-product-index-streaming-extensions-streaming-extensions-1.0.html

如果引擎支持这一点,则实例可以拥有的大小没有理论上的限制,除了磁盘容量以及查询在流经时需要在内存中维护多少中间数据(例如,聚合查询计数将需要跟踪其键和相关计数)。与可以做的相比,50GB 相对较小。我仍然希望根据确切的用例来处理至少需要一位数或两位数的分钟数。

我不确定 Arelle 目前是否支持流媒体。现在大多数 XBRL 处理器在内存中实现实例,但我预计会有一些 XBRL 处理器实现流扩展。

最后,我认为减少输入的大小(例如使用 CSV 语法)有助于提高速度和内存占用。一个 50G XBRL 实例很可能可以以正确的格式存储在不到 50G 的内存中,而表格 (CSV) 是一种很好的方法。话虽如此,还应该记住,磁盘上使用的语法不必与内存中的数据结构相匹配,只要外部行为不变,任何引擎都可以自由地设计它认为合适的方式。

于 2019-11-14T12:23:14.000 回答