使用Elixir中的Task.async_stream将1K图像写入磁盘

时间:2020-05-29 10:08:26

标签: elixir gpu

我正在通过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却更快。磁盘IO开始触及极限

enter image description here

写入这些文件的目的是将它们以1000个批次发送到Dropbox,因为dropbox上载会话一次支持1000张图像。

是否有更好的方法将图像写入磁盘?也许在内存中,但我不知道,任何帮助都将是很棒的,而且此操作正在Cuda GPU machine上进行,但是我不确定如何将GPU用于此目的。

此过程是用户定义的。用户可以要求少于/多于1000张图片,而这些图片可以是一个或多个Task.async_stream的

1 个答案:

答案 0 :(得分:2)

一种可能的长生不老药方法

我是Elixir的新手,但是您可以尝试使用ETS表将它们临时写入内存,但不要忘记按照链接建议将其包装到GenServer中。因此,该教程适用于键/值缓存,我认为您可以轻松适应自己的用例。

磁盘方法

有什么更好的方法可以将图像写入磁盘吗?

Linux操作系统具有ram disks

RAM磁盘也称为RAM驱动器。这是RAM的一部分,已使用文件系统格式化。您可以将其挂载到Linux系统上的目录中,并将其用作磁盘分区。

如何在任何Linux发行版中创建RAM磁盘

从链接的文章中,我为您提取了主要步骤...

创建目录:

sudo mkdir /tmp/ramdisk

使用设备名称myramdisk并使用具有10GB ram磁盘空间的tmpfs文件系统挂载它:

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
相关问题