Tcl 嵌套字典是否使用对引用的引用,并避免容量问题?

Is Tcl nested dictionary uses references to references, and avoids capacity issues?

根据主题: Tcl 不能有 >128M list/dictionary 个元素。但是,一个人可能有一个嵌套的字典,其总值(在不同级别)超过了数字。
现在,嵌套字典是否使用引用,设计?这意味着只要在字典树的第 1 层中,元素不超过 128M,就应该没问题。真的吗? 谢谢

目前的限制是没有单个内存对象(C结构或数组)可以大于2GB,这是因为高性能内存分配器(和其他一些键 APIs)使用带符号的 32 位整数作为要分配的内存块的大小。

这在 32 位机器上不是一个重要的限制,OS 本身通常会在您开始接近该限制时限制您。 然而,在 64 位机器上可以寻址更多,同时指针的大小加倍,例如,2GB 的 space 意味着一个列表大约有 256k 个元素,因为每个元素至少需要一个指针来保存其中值的引用。此外,在这种方案中,引用计数器系统很可能会达到极限,尽管这不是这里的问题。

如果您创建一个嵌套结构,其中可以容纳的叶子内存对象的总数可以大得多,但是您需要非常小心,永远不要得到列表或字典的字符串序列化,因为这可能会达到 2GB 的硬限制。如果你真的要处理大量的值,你可能要考虑使用像 SQLite 这样的数据库作为存储,因为它可以透明地由磁盘支持。


修复这个问题很麻烦,因为它影响了很多 API 和 ABI,并在这个过程中造成了很多破坏(如果不小心,还会有一些细微的错误,IIRC)。我们将在 Tcl 9.0 中修复它。