【问题标题】:How to write file to RAM on Linux如何在 Linux 上将文件写入 RAM
【发布时间】:2014-09-03 21:22:13
【问题描述】:

我无法修改的程序将其输出写入作为参数提供的文件。我想让输出进入 RAM,这样我就不必做不必要的磁盘 IO。 我以为我可以使用 tmpfs 并“欺骗”程序来写入它,但并非所有 Linux 发行版都将 tmpfs 用于 /tmp,一些在 /run(Ubuntu)下安装 tmpfs,其他在 /dev/shm(RedHat)下。 我希望我的程序尽可能可移植,如果可以避免的话,我不想在用户系统上创建 tmpfs 文件系统。 显然我可以做 df | grep tmpfs 并使用返回的任何安装,但我希望有一些更优雅的东西。 是否可以写入伪终端或 /proc 某处?

【问题讨论】:

  • 由于 Linux 的磁盘缓存,它可能无论如何都会进入 RAM。
  • 既然你已经标记了这个问题python,那么stringIO呢?基本上,它允许您将字符串变量用作文件。
  • 这是针对您正在编写的程序,还是已经编写的您无法修改的程序?你的问题在这个问题上是矛盾的。
  • 我正在编写一个重复调用另一个程序的 python 程序。 StringIO 不起作用,我从脚本调用的程序正在获取要写入的文件的位置,而不是实际的文件句柄。
  • PyFilesystem 可能很适合。 docs.pyfilesystem.org/en/latest/tempfs.html#module-fs.tempfs 基本上你正在尝试创建一个用户空间 ramdisk。不过,我仍然会尝试查找已安装的 tmpfs。 (例如 mount | egrep -wi "tmpfs" | egrep -iv "/sys" | egrep "755" )

标签: python linux proc tmpfs


【解决方案1】:

/proc/self/fd/1 作为文件名传递给子程序。所有对/proc/self/fd/1 的写入实际上都将转到子程序的标准输出。使用subprocess.Popen()等来捕获孩子的标准输出。

【讨论】:

  • 这应该适用于所有版本的 Linux,并且运行该程序的用户将始终拥有该文件的权限,对吧?
  • 可能,是的,分别。
  • @user2036161 - 这里讨论了这种技术的可移植性:unix.stackexchange.com/questions/123602/…
  • @ventsyv:这是一个代码示例,它演示了同一问题的命名管道和 /dev/fd/N 文件名。 Multiple pipes in subprocess
【解决方案2】:

如果子进程接受不可搜索的文件,您可以try named pipes。命名管道的内容不接触磁盘。

【讨论】:

  • 我最终把它写成一个线程程序——我会创建管道,创建一个调用第二个程序的线程,然后在主线程中我会打开管道,这会解除阻塞并且我得到来自其他进程的数据。效果很好。
【解决方案3】:

您可以将您的 Python 脚本分成两部分,一部分重复调用另一个程序,另一部分合并结果,然后将前者转换为 Bash 脚本,以便您可以使用 >() 进程替换构造传递一个伪文件到另一个程序,实际上是另一个进程的标准输入。

概念验证:

假设这是另一个程序:

$ cat otherprogram.py 
#/usr/bin/env python
import sys

with open(sys.argv[1], 'w') as file:
          file.write('Hello\n')

它在参数中接受一个文件名并向其写入“Hello”。假设您需要调用它五次。然后你可以这样做:

for i in {1..5}; do python otherprogram.py >(cat) ; done

这会将otherprogram.py 认为它正在写入文件的内容输出到标准输出。然后,您可以将其与 Python 脚本的其他部分一起使用,如下所示:

$ cat consume.py 
#!/bin/env python

import fileinput

for line in fileinput.input():
        print "Processing line ", line

(这只是在“你好”前面加上一些东西)

$ { for i in {1..5}; do python otherprogram.py >(cat) ; done } | python consume.py
Processing line  Hello

Processing line  Hello

Processing line  Hello

Processing line  Hello

Processing line  Hello

所以otherprogram.py 认为它正在写入文件,实际上它正在发送到您的程序的标准输入,而这要归功于 Bash 的进程替换机制。

【讨论】:

  • 我认为可以做到!我可能甚至不需要将它拆分为 bash 脚本,我可以通过 subprocess.Popen() 调用直接从 python 调用它。今晚晚些时候我会试一试,我会告诉你它是如何工作的。
  • @user2036161: >() 可能通过/proc/self/fd/ 在可用的地方实现,并在其他地方使用命名管道
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多