内存结构

从来没有使用pytables但是看源代码:

class _Deadnodes(lrucacheExtension.NodeCache):

pass

所以看起来像使用LRU缓存实现_deadnode. LRU ==“最近使用的”,这意味着它将首先丢弃最少使用的节点.来源是here.

class _AliveNodes(dict):

...

它们用作在程序中实际运行和表示的节点的定制字典.

非常简化的例子(节点是字母,缓存中的数字表示条目是多么陈旧):

memory of 4, takes 1 time step

cache with size 2, takes 5 times steps

disk with much much more, takes 50 time steps

get node A //memory,cache miss load from disk t=50

get node B // "" t=100

get node C // "" t=150

get node D // "" t=200

get node E // "" t=250

get node A //cache hit load from cache t=255

get node F //memory, cache miss load from disk t=305

get node G //memory, cache miss load from disk t=355

get node E // in memory t=356 (everything stays the same)

t=200 t=250 t=255

Memory CACHE Memory CACHE Memory CACHE

A E A0 E B0

B B A

C C C

D D D

t=305 t=355

Memory CACHE Memory CACHE

E B1 E G0

A C0 A C1

F F

D G

正如你在现实生活中所知道的,这些结构是巨大的,访问它们的时间是在公共汽车周期,所以1 /(你的电脑的时钟).

相比之下,访问元素所需的时间是相同的.在内存方面可以忽略不计,缓存多一点,而且还有更多的磁盘.从磁盘读取是整个过程中最长的一部分.磁盘和手臂需要移动等.它是一个物理过程,而不是电子过程,因为它不会以光速发生.

在这里,pytables他们做类似的事情.他们在Cython中编写了自己的缓存算法,它是活着的节点(内存)和完整数据(磁盘)之间的中间人.如果命中率太低,那么看起来高速缓存将被关闭,并且在一定数量的周期后,它将再次打开.

在parameters.py年,DISABLE_EVERY_CYCLE,ENABLE EVERY_CYCLE和LOWEST_HIT_RATIO变量用于定义LOWEST_HIT_RATIO下的周期数以禁用以及等待重新启用的周期数.不建议更改这些值.

您应该从中获取的主要内容是,如果您需要在大数据集上进行处理,请确保它们位于相同的节点上.如果你可以摆脱它,读一个大块,做处理那个卡盘,得到你的结果,然后加载另一个块.如果你加载块A,得到另一个块B,然后再次加载块A,这将导致最大的延迟.一次只能对一个数据块进行操作,并保持访问和写入的最低限度.一旦一个值在_alivenodes中,它是快速修改它,_deadnodes有点慢,也不会慢很多.

NODE_CACHE_SLOTS

params [‘NODE_CACHE_SLOTS’]定义了一组死节点的大小.追溯到parameters.py它默认为64.它声明您可以尝试不同的值并回报.您可以更改文件中的值或执行以下操作:

import parameters

parameters.NODE_CACHE_SLOTS = # something else

这仅限制保存在缓存中的节点数.过去,你被python的堆大小限制,设置为this.

附加/冲洗

对于附加,冲洗确保行被输出到表.随着数据的移动越多,数据从内部缓冲区移动到数据结构所需的时间越长.它正在调用H5TBwrite_records功能的修改版本与其他处理代码.我猜,调用长度决定了输出周期多长时间.

请记住,这些都来自源代码,不考虑任何额外的魔法,他们正在努力做.我从来没有使用过pytables.理论上不应该崩溃,但我们不会生活在一个理论界.

编辑:

其实我发现自己需要pytables我已经遇到了this question在他们的常见问题,可能会回答你的一些担忧.

谢谢你给我发布pytables,如果我在研究这个问题之前碰到过.h5文件,我不知道该怎么办.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐