【发布时间】:2013-02-05 16:47:03
【问题描述】:
我试图了解 PyTables 如何管理大于内存大小的数据。 这是 PyTables (link to 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 方法中找到有用的 cmets。
似乎 PyTables 具有非常智能的 IO 缓冲系统,据我了解,它将用户引用的数据存储在快速 RAM 中作为“aliveNodes”,在需要时将之前和当前未引用的数据保持为“deadNodes”以快速“恢复”它,并且如果请求的键不存在于死或活类别中,则从磁盘读取数据。
我需要一些专业知识,了解 PyTables 在处理大于可用内存的数据时如何准确处理情况。我的具体问题:
- deadNode/aliveNode 系统如何工作(常见图片)?
- aliveNodes/deadNodes 之间的主要区别是什么,而它们都表示存储在 RAM 中的数据,如果我是对的?
- 可以手动调整用于缓冲的 RAM 限制吗?在注释下方,有一段代码从
params['NODE_CACHE_SLOTS']读取值。它可以由用户以某种方式指定吗?例如,如果我想为其他也需要内存的应用程序留出一些 RAM? - 在什么情况下 PyTables 在处理大量数据时会崩溃或显着变慢 数据的?在我的情况下可以超过内存 100 倍,在这种情况下常见的陷阱是什么?
- PyTables 在大小、数据结构以及对被认为是“正确”的数据进行操作以实现最佳性能方面有何用途?
-
Docs suggests 在每个基本
.append()循环之后使用.flush()。这个周期实际上可以有多长?我正在执行一个小基准测试,比较 SQLite 和 PyTables 如何处理使用大 CSV 文件中的键值对创建一个巨大的表。当我使用.flush()时,在主循环中使用频率较低,PyTables 获得了巨大的加速。那么——对.append()比较大的数据块,然后使用.flush()是正确的吗?
【问题讨论】:
-
您无法将内容存储在 100 倍可用 RAM 的内存中。但是,PyTables 可以帮助您以块的形式访问数据或以内存有效的方式(有时)将函数应用于您的数据。你想用你的数据做什么?