我有一个程序(从终端运行)可以生成 4 个纯文本文件。
例如
./myprog
生成file1.dat
, file2.dat
, file3.dat
, file4.dat
。
我想创建一个脚本,允许我运行myprog
和加载(读取)这四个“文件输出”,但不写入物理文件(可能只在内存中加载该文件)。这可能吗?
原因是我需要大约 70000 个这样的文件,所以我不想浪费时间保存额外的文件,我只需要使用这些信息。
===============================================
评论中问我的具体例子
- 三角软件(用于生成数值微积分网格的免费软件,用 C 编写)读取文件
mesh.poly
:
:
4 2 0 1
1 0 0 20
2 1 0 20
3 1 1 10
4 0 1 10
4 1
1 1 2 20 # bottom side
2 2 3 20 # right side
3 3 4 10 # top side
4 4 1 20 # left side
0
1
1 0.5 0.5 1 0.0005
- 该命令
triangle mesh.poly
生成以下文件:
mesh.node
:
4 2 0 1
1 0 0 20
2 1 0 20
3 1 1 10
4 0 1 10
和mesh.ele
2 3 0
1 4 1 2
2 2 3 4
和其他两个文件,总共:四个输出文件。
- 生成此文件后,我需要使用我在 Fortran 上编写的其他程序中的信息,这些程序需要
*.node
和*.ele
信息。我正在考虑编写一个.sh
文件来自动执行此操作,但我可以使用 python 或任何允许我运行可执行程序的语言。
加载(读取)mesh.node
和mesh.ele
很容易。但我需要生成数千个物理文件作为triangle
我的 Fortran 代码的输出和输入。是因为,我正在寻找一种“编写虚拟文件”的方法认为这样会更高效、更干净。
我的问题是我有大约 70000 个mesh.poly
生成 70000x4 输出(和很少)的文件。
答案1
你可以使用aa内存支持的文件系统 (tmpfs), 或者FIFO(命名管道)
也许您的发行版已经tmpfs
在某处设置了支持的安装点。您可以将其用于所有临时文件。 (例如/tmp/
在某些系统和配置上)
在我的系统上,默认情况下,我在 /run/user/1000 下获得了足够大的 tmpfs,这对于您指定的 <300MiB 来说就很好了。
如果您是机器上的root用户,您可以在某处安装一个新机器并使用它。
如果失败:作为普通用户,您可以设置 4 个命名管道并将mkfifo
它们用作“临时存储区域”。
然后,您的算法可以采用以下伪代码行。
make_4_fifos_with_mkfifo
foreach polyfile in directory do
rename_fifos_to_use_given_prefix $polyfile
run triangle $polyfile
run fortranCMD polyfile.node $polyfile.ele ...
done
上面的代码可以用系统上现有的许多脚本语言来实现。选择您觉得舒服的任何一个。
答案2
很简单,你可以用perl或tcl编写脚本。下面是 tcl 的例子。
set fp [open "somefile" r]
set file_data [read $fp]
close $fp
set data [split $file_data "\n"]
foreach line $data {
# do some line processing here
}
在此示例中,somefile 是文件名,内容被复制到变量 file_data 中。
了解更多信息http://wiki.tcl.tk/367