Когда zarr сжимает фрагмент и отправляет его sh в базовую систему хранения? - PullRequest
0 голосов
/ 09 мая 2020

Я читаю данные из большого текстового файла (VCF) в массив zarr. Общий поток кода:

with zarr.LMDBStore(...) as store:
    array = zarr.create(..., chunks=(1000,1000), store=store, ...)
    for line_num, line in enumerate(text_file):
        array[line_num, :] = process_data(line)

Мне интересно - когда zarr сжимает измененные фрагменты массива и делает их sh в базовое хранилище (в данном случае LMDB)? Делает ли он это каждый раз, когда обновляется чанк (т.е. каждая строка)? Или перед этим он ждет, пока чанк будет заполнен / удален из памяти? Предполагая, что мне нужно обрабатывать каждую строку отдельно для l oop (что здесь нет эффективных операций с массивами для использования из-за характера данных и обработки), есть ли какая-либо оптимизация, которую я должен сделать здесь в отношении как я загружаю данные в Zarr?

Я просто не хочу, чтобы Zarr запускал сжатие для каждого измененного фрагмента в каждой строке, когда каждый фрагмент будет изменен 1000 раз, прежде чем будет завершен и готов к сохранению на диск.

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 мая 2020

Каждый раз, когда вы выполняете эту строку:

         array[line_num, :] = process_data(line)

... zarr (1) выясняет, какие фрагменты перекрывают область массива, в которую вы хотите записать, (2) извлекает эти фрагменты из хранилища , (3) распаковать фрагменты, (4) изменить данные, (5) сжать измененные фрагменты, (6) записать измененные сжатые фрагменты в хранилище.

Это произойдет независимо от типа базового хранилище, которое вы используете.

Если вы создали массив с фрагментами высотой более одной строки, то это, вероятно, будет неэффективным, в результате каждый фрагмент будет считываться, распаковываться, обновляться, сжиматься и записываться много раз .

Лучшей стратегией было бы проанализировать ваш входной файл блоками по N строк, где N равно количеству строк в каждом фрагменте выходного массива, так что каждый фрагмент сжимается и записывается только один раз.

Если под VCF вы имеете в виду файлы Variant Call Format, вы можете посмотреть на реализацию функции vcf_to_zarr в scikit-allel.

0 голосов
/ 11 мая 2020

Я считаю, что хранилище LMDB (насколько я могу судить) будет записывать / сжимать каждый раз, когда вы назначаете.

Вы можете агрегировать свои строки в Zarr в памяти, а затем назначать для каждого блока.

Может быть «пакетная» опция для наборов данных, но она еще не реализована насколько я могу судить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...