使用np.load进度条加载.npy文件

时间:2017-03-09 09:46:38

标签: python numpy progress-bar

我有一个非常大的.npy文件(以前用np.save保存),我正在加载它:

 SELECT T1.product, SUM(T2.amount) 
 FROM table1 T1 
 INNER JOIN table2 T2 ONT1.product = T2.product_t1 

 Gruop by T1.product

有没有办法看到加载过程的进度?我知道tqdm和其他一些用于监控进度的库但不知道如何使用它们来解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

据我所知,np.load没有提供任何回调或挂钩来监控进度。但是,有一个可行的工作:np.load可以将文件作为内存映射文件打开,这意味着数据保留在磁盘上并仅在需要时加载到内存中。我们可以滥用这个机器手动将数据从内存映射文件复制到实际内存中,使用一个可以监视其进度的循环。

以下是粗略进度监视器的示例:

import numpy as np

x = np.random.randn(8096, 4096)
np.save('file.npy', x)

blocksize = 1024  # tune this for performance/granularity

try:
    mmap = np.load('file.npy', mmap_mode='r')
    y = np.empty_like(mmap)
    n_blocks = int(np.ceil(mmap.shape[0] / blocksize))
    for b in range(n_blocks):
        print('progress: {}/{}'.format(b, n_blocks))  # use any progress indicator
        y[b*blocksize : (b+1) * blocksize] = mmap[b*blocksize : (b+1) * blocksize]
finally:
    del mmap  # make sure file is closed again

assert np.all(y == x)

将任何进度条库插入循环应该是直截了当的。

由于内存限制,我无法使用异常大的阵列对此进行测试,因此我无法确定此方法是否存在任何性能问题。