python 处理数据量大的数据内存_python – PyTables处理的数据大小比内存大小多一倍...
内存结构从来没有使用pytables但是看源代码:class _Deadnodes(lrucacheExtension.NodeCache):pass所以看起来像使用LRU缓存实现_deadnode. LRU ==“最近使用的”,这意味着它将首先丢弃最少使用的节点.来源是here.class _AliveNodes(dict):...它们用作在程序中实际运行和表示的节点的定制字典.非常简化的例子(
内存结构
从来没有使用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文件,我不知道该怎么办.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)