我试图了解 PyTables 如何管理大小大于内存大小的数据。以下是 PyTables 代码中的注释(链接到 GitHub):
# Nodes referenced by a variable are kept in `_aliveNodes`.
# When they are no longer referenced, they move themselves
# to `_deadNodes`, where they are kept until they are referenced again
# or they are preempted from it by other unreferenced nodes.
在_getNode方法中也可以找到有用的注释。
似乎 PyTables 具有非常智能的 IO 缓冲系统,据我了解,它将用户引用的数据存储在快速 RAM 中作为“aliveNodes”,在需要时将之前和当前未引用的数据保持为“deadNodes”以快速“恢复”它,并且如果请求的键不存在于死或活类别中,则从磁盘读取数据。
在处理大于可用内存的数据时,我需要一些关于 PyTables 如何准确处理情况的专业知识。我的具体问题:
- deadNode/aliveNode 系统如何工作(常见图片)?
- 如果我是对的,aliveNodes/deadNodes 之间的主要区别是什么,它们都代表存储在 RAM 中的数据?
- 可以手动调整用于缓冲的 RAM 限制吗?在注释下方,有一段代码从
params['NODE_CACHE_SLOTS']
. 它可以由用户以某种方式指定吗?例如,如果我想为其他需要内存的应用程序留下一些 RAM? - 在处理大量数据时,PyTables 在什么情况下会崩溃或显着变慢?在我的情况下可以超过内存 100 倍,在这种情况下常见的陷阱是什么?
- PyTables 在大小、数据结构以及对被认为是“正确”的数据进行操作以实现最佳性能方面有何用途?
- Docs 建议
.flush()
在每个基本.append()
周期后使用。这个周期实际上可以有多长?我正在执行一个小基准测试,比较 SQLite 和 PyTables 如何处理使用大 CSV 文件中的键值对创建一个巨大的表。当我.flush()
在主循环中使用较少的时候,PyTables 获得了巨大的加速。那么 - 对相对较大的数据块是否正确,.append()
然后使用.flush()
?