【问题标题】:Efficient way of storing 1TB of random data with Zarr使用 Zarr 存储 1TB 随机数据的有效方法
【发布时间】:2020-05-14 21:45:12
【问题描述】:

我想在磁盘阵列上存储由 zarr 支持的 1TB 随机数据。目前,我正在执行以下操作:

import numpy as np
import zarr
from numcodecs import Blosc

compressor = Blosc(cname='lz4', clevel=5, shuffle=Blosc.BITSHUFFLE)
store = zarr.DirectoryStore('TB1.zarr')
root = zarr.group(store)
TB1 = root.zeros('data',
           shape=(1_000_000, 1_000_000),
           chunks=(20_000, 5_000),
           compressor=compressor,
           dtype='|i2')

for i in range(1_000_000): 
    TB1[i, :1_000_000] = np.random.randint(0, 3, size=1_000_000, dtype='|i2')

这需要一些时间——我知道如果我不总是生成1_000_000 随机数而是重用数组,那么事情可能会有所改善,但我现在想要更多随机性。有没有更好的方法来构建这个随机数据集?

更新 1

使用更大的 numpy 块会加快速度:

for i in range(0, 1_000_000, 100_000): 
    TB1[i:i+100_000, :1_000_000] = np.random.randint(0, 3, size=(100_000, 1_000_000), dtype='|i2')

【问题讨论】:

    标签: numpy zarr


    【解决方案1】:

    我建议使用Dask Array,它可以并行计算随机数和存储,例如:

    import zarr                                                           
    from numcodecs import Blosc                                           
    import dask.array as da                                               
    
    shape = 1_000_000, 1_000_000                                          
    dtype = 'i2'                                                          
    chunks = 20_000, 5_000                                                
    compressor = Blosc(cname='lz4', clevel=5, shuffle=Blosc.BITSHUFFLE) 
    
    # set up zarr array to store data
    store = zarr.DirectoryStore('TB1.zarr')
    root = zarr.group(store) 
    TB1 = root.zeros('data', 
                     shape=shape, 
                     chunks=chunks, 
                     compressor=compressor, 
                     dtype=dtype) 
    
    # set up a dask array with random numbers
    d = da.random.randint(0, 3, size=shape, dtype=dtype, chunks=chunks)  
    
    # compute and store the random numbers
    d.store(TB1, lock=False)                                             
    

    默认情况下,Dask 将使用所有可用的本地内核进行计算,但也可以通过 Distributed 包配置为在集群上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多