我正在通过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开始触及极限
写入这些文件的目的是将它们以1000个批次发送到Dropbox,因为dropbox上载会话一次支持1000张图像。
是否有更好的方法将图像写入磁盘?也许在内存中,但我不知道,任何帮助都将是很棒的,而且此操作正在Cuda GPU machine
上进行,但是我不确定如何将GPU用于此目的。
此过程是用户定义的。用户可以要求少于/多于1000张图片,而这些图片可以是一个或多个Task.async_stream的
答案 0 :(得分:2)
我是Elixir的新手,但是您可以尝试使用ETS表将它们临时写入内存,但不要忘记按照链接建议将其包装到GenServer中。因此,该教程适用于键/值缓存,我认为您可以轻松适应自己的用例。
有什么更好的方法可以将图像写入磁盘吗?
Linux操作系统具有ram disks:
RAM磁盘也称为RAM驱动器。这是RAM的一部分,已使用文件系统格式化。您可以将其挂载到Linux系统上的目录中,并将其用作磁盘分区。
从链接的文章中,我为您提取了主要步骤...
创建目录:
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