Запись изображений размером 1К на диск с помощью Task.async_stream в Elixir - PullRequest
2 голосов
/ 29 мая 2020

Я загружаю изображения через HTTP-запрос, с помощью которого я получаю двоичное изображение и записываю его в файл, например

File.write(image_with_dir, image, [:binary]) |> File.close

, вся эта операция получения HTTP-запроса и последующей записи его на диск сделано в

|> List.flatten()
|> Enum.sort()
|> Task.async_stream(&(inline_process.(&1, images_directory)), max_concurrency: System.schedulers_online() * 2, timeout: :infinity)
|> Stream.run

При уменьшении max_concurrency процесс замедляется примерно на 2 минуты, также результаты System.schedulers_online() равны 8

, но с текущим max_concurrency он быстрее, но с этим. Дисковый ввод-вывод начинает достигать пределов

enter image description here

Целью записи этих файлов является их отправка в Dropbox пакетом из 1000, поскольку сеанс загрузки Dropbox поддерживает 1000 изображений за раз.

Есть ли лучший способ записывать образы на диск? возможно, в памяти, но я не знаю, любая помощь была бы замечательной, также эта операция выполняется на Cuda GPU machine, но я не уверен, как я могу использовать графический процессор для этой цели.

Этот процесс определяется пользователем . пользователь может запросить меньше / больше 1000 изображений, и это может быть одно или несколько Task.async_stream

1 Ответ

2 голосов
/ 29 мая 2020

Возможный подход с использованием Эликсира

Я новичок ie в Эликсире, но вы можете попробовать использовать таблицу ETS для временной записи их в память, но не забывайте чтобы обернуть его GenServer в соответствии с рекомендациями по ссылке. Итак, руководство предназначено для кеширования ключей / значений, и я думаю, вам будет легко адаптироваться к вашему варианту использования.

Дисковый подход

Есть ли лучший способ записывать образы на диск?

Linux ОС имеют RAM-диски :

RAM-диск также известен как RAM-диск. Это часть вашей оперативной памяти, созданная с файловой системой. Вы можете смонтировать его в каталог в вашей системе Linux и использовать как раздел диска.

Как создать RAM-диск в любом Linux Distro

Из связанная статья Я извлек для вас основные шаги ...

Создайте каталог:

sudo mkdir /tmp/ramdisk

Смонтируйте его с именем устройства myramdisk и используя файловую систему tmpfs с 10 ГБ свободного места на RAM-диске:

sudo mount -t tmpfs -o size=10G myramdisk /tmp/ramdisk

ПРИМЕЧАНИЕ: Настройте 10G в соответствии с вашими потребностями и доступной памятью на вашем сервере.

Проверьте, что он смонтирован:

mount | tail -n 1

Вы можете отключить его в любое время, чтобы освободить память:

sudo umount /tmp/ramdisk/

Автоматически смонтировать его при загрузке системы, добавив к /etc/fstab:

myramdisk  /tmp/ramdisk  tmpfs  defaults,size=10G,x-gvfs-show  0  0

Протестируйте его

Тестируйте скорость записи с:

sudo dd if=/dev/zero of=/tmp/ramdisk/zero bs=4k count=100000

Тестируйте скорость чтения с:

sudo dd if=/tmp/ramdisk/zero of=/dev/null bs=4k count=100000
...