Честное и реалистичное сравнение с использованием Dask - PullRequest
0 голосов
/ 25 июня 2018

Чтобы лучше понять библиотеку dask в python, я пытаюсь провести справедливое сравнение между использованием dask и не.Я использовал h5py, чтобы создать большой набор данных, который позже использовался для измерения среднего значения на одной из осей как операция с единичным стилем.

Мне было интересно, действительно ли то, что я сделал, было честным сравнением, чтобы проверить, может ли dask запускать код параллельно.Я читал документацию как h5py, так и dask, поэтому я придумал этот маленький эксперимент.

До сих пор я делал:

  1. Создать(напишите) набор данных, используя h5py.Это было сделано с помощью альтернативы maxshape и resize для добавления данных во избежание загрузки сразу всей памяти в память, чтобы избежать проблем с памятью.

  2. Оценить простую операцию (измерить среднее значение) по одной оси, используя «классический код», что означает среднее значение оценки для каждой 1000 строк.

  3. Повторите предыдущий шаг, но на этот раз, используя dask.

Итак, для первого шага вот что я получил:

# Write h5 dataset
chunks = (100,500,2)
tp = time.time()
with h5py.File('path/3D_matrix_1.hdf5', 'w') as f:
    # create a 3D dataset inside one h5py file
    dset = f.create_dataset('3D_matrix', (10000, 5000,2), chunks = chunks, maxshape= (None,5000,2 ),compression = 'gzip') # to append dato on axis 0
    print(dset.shape)
    while dset.shape < 4*10**7: # append data until axis 0 = 4*10**7
        dset.resize(dset.shape[0]+10**4, axis=0)  # resize data
        print(dset.shape) # check new shape for each append
        dset[-10**4:] = np.random.randint(2, size=(10**4, 5000, 2))
    tmp  = time.time()- tp
    print('Writting time: {}'.format(tmp))

На втором шаге я читаю предыдущий набор данных и измеряю время при оценке среднего.

# Classical read
tp = time.time()
filename = 'path/3D_matrix_1.hdf5'
with h5py.File(filename, mode='r') as f:
    # List all groups (actually there is only one)
    a_group_key = list(f.keys())[0] # group the only one dataset in h5 File.
    # Get the data
    result = f.get(a_group_key)
    print(result.shape)
    #print(type(result))
    # read each 1000 elements
    start_ = 0 # initialize a start counter
    means = []
    while start_ < result.shape[0]:
        arr = np.array(result[start_:start_+1000])
        m = arr.mean()
        #print(m)
        means.append(m)
        start_ += 1000
    final_mean = np.array(means).mean()
    print(final_mean, len(final_mean))
    tmp  = time.time()- tp
    print('Total reading and measuring time withouth dask: {:.2f}'.format(tmp))

В качестве подхода третьего шага я поступаю следующим образом:

# Dask way
from dask import delayed
tp = time.time()
import dask.array as da
filename = 'path/3D_matrix_1.hdf5'
dset = h5py.File(filename, 'r')
dataset_names = list(dset.keys())[0] # to obtain dataset content
result = dset.get(dataset_names)
array = da.from_array(result,chunks = chunks) # should this be paralelized with delayed?
print('Gigabytes del input: {}'.format(array.nbytes / 1e9))  # Gigabytes of the input processed lazily
x = delayed(array.mean(axis=0)) # use delayed to parallelize (kind of...)
print('Mean array: {}'.format(x.compute())) 
tmp = time.time() - tp
print('Total reading and measuring time with dask: {:.2f}'.format(tmp))

Я думаю,Я пропускаю некоторые процедуры, кажется, выполнение времени в сумме занимает больше, чем классический метод.Кроме того, я думаю, что причиной этого может быть вариант чанка, поскольку я использовал одинаковый размер чанка как для h5 набора данных, так и для dask.

. Любое предложение этой процедуры будет приветствоваться.

...