Sed:降低数据处理速度

Sed:降低数据处理速度,sed,gnuplot,Sed,Gnuplot,我有大文件(10-20GB),在使用Gnuplot绘制数据之前,我用Sed对其进行预处理。绘图保存为.png图像。数据文件由图像大小为matrix\u size x matrix\u size的矩阵组成。两个大小为matrix_size=2的(images=3)矩阵的data文件如下所示: 1 2 3 2 1 5 3 4 5 2 2 3 我使用Sed提取数据文件的每个矩阵。开始时,这种情况发生得非常快,我的脚本每秒生成一个图像。但一段时间后,每张图像的时间增加到25秒。为什么会这样

我有大文件(10-20GB),在使用Gnuplot绘制数据之前,我用Sed对其进行预处理。绘图保存为.png图像。
数据
文件由
图像
大小为
matrix\u size x matrix\u size的矩阵
组成。两个大小为
matrix_size=2
的(
images=3
)矩阵的
data
文件如下所示:

 1 2
 3 2
 1 5
 3 4
 5 2
 2 3
我使用Sed提取
数据
文件的每个矩阵。开始时,这种情况发生得非常快,我的脚本每秒生成一个图像。但一段时间后,每张图像的时间增加到25秒。为什么会这样?这是我的密码:

unset border
unset key
unset xtics
unset ytics
unset ztics
unset colorbox

set autoscale fix
set size ratio -1

file = 'data'
matrix_size = 1000
images = 1000

sizeX = matrix_size
sizeY = matrix_size
set xrange [1:matrix_size]
set yrange [1:matrix_size]
set terminal png size sizeX, sizeY

getMatrix(fileName, n, i) = sprintf("<sed -n '%d,%dp;%dq' '%s'", (i-1)*n + 1, i*n, i*n+1, fileName)

do for [i=1:images]{
    t0 = strftime('%s', time(0))    
    set output sprintf('%05d_%s.png', i, file)
    plot getMatrix(file, matrix_size, i) matrix with image
    t1 = strftime('%s', time(0))
    print(sprintf('%d %d', t1-t0, i))
}
unset边框
取消设置键
未设置xtics
取消加密
未设置ztics
未设置色盒
设置自动缩放修复
设置大小比率-1
文件='数据'
矩阵大小=1000
图像=1000
sizeX=矩阵大小
sizeY=矩阵大小
设置X范围[1:矩阵大小]
设置Y范围[1:矩阵大小]
设置终端png大小sizeX,sizeY

getMatrix(fileName,n,i)=sprintf(如注释中所述,
sed
命令必须始终从数据文件的开头开始搜索第i帧,这可能需要很长时间。我不知道在gnuplot中使用循环构造时是否可以避免这种情况。但是,您可以使用
awk
(也可能是
sed
)一次遍历数据文件,然后插入
gnuplot
命令,在正确的行号处设置并完成一个帧。我很好奇这样的操作是否适用于您;如果适用,我假设在以后的帧中不会显示减速:

unset border
unset key
unset xtics
unset ytics
unset ztics
unset colorbox

set autoscale fix
set size ratio -1

matrix_size = 1000

sizeX = matrix_size
sizeY = matrix_size
set xrange [-0.5:matrix_size-0.5]
set yrange [-0.5:matrix_size-0.5]
set terminal png size sizeX, sizeY

file = "data"
load sprintf("< cat %s | awk \'\
    BEGIN {i = 0;} \
    NR %% %d == 1 \{ \
      print \"print \\\"Creating image \" i \" \\\"\"; \
      print \"set output \\\"%s_\" i \".png\\\"\"; \
      print \"plot \\\"-\\\" matrix with image\"; \
    } \
    {print;} \
    NR %% %d == 0 { \
      print \"e\\ne\"; \
      i = i+1; \
    } \
  \'", file, matrix_size, file, matrix_size)
命令

cat data | awk 'NR % 3 == 1 {print "plot \"-\" matrix with image";} {print;} NR % 3 == 0 {print "e\ne";}'
读取此文件并创建以下输出:

plot "-" matrix with image
1 2 3
4 5 6
7 8 9
e
e
plot "-" matrix with image
10 11 12
16 17 18
13 14 15
e
e
这是有效的gnuplot代码。它通过在第1行和第4行之前插入带有图像的
plot“-”矩阵,并在第3行和第6行之后插入两个
e
。您可以将此输出保存到一个文件中,让gnuplot运行它,也可以使用
load sprint()从gnuplot内部直接运行代码
构造。这很好,因为您只有一个脚本,但必须小心转义引号和反斜杠字符。上面的代码还添加了一个计数器,以便为每个图像使用新的文件名(以及为每个图像设置输出数据_FRAMENUMBER.png
行)


获取大的
数据
文件并将其拆分为多个较小的文件(每帧一个)可能更容易。但是,如果由于某种原因无法做到这一点(在一个目录中有数千个文件可能会很烦人),或者如果您必须保留一个大文件以进行其他类型的处理,那么这是一个合理的解决方案。

我建议您使用
split
一次将所有矩阵提取到单个文件中:

split -a 4 -d -l matrix_size data matrix-

这将把每个矩阵放在一个单独的文件中,名为
matrix-0000
matrix-0001
,如果我理解了你的文件格式。

根据你的绘图输出,700000行之后处理会变慢,是吗?如果
getMatrix()
函数是由您编写的,那么您应该了解mean@RomanPerekhrest抱歉,我不明白你的意思。@RomanPerekhrest我阅读了Sed文档来编写getMatrix()功能。其他帖子也建议在使用Sed时使用类似的方法来处理大型数据文件。可能我并不完全理解所有内容,但我认为这里是寻求帮助的地方。对于每个图像,您的
Sed
命令从文件开头开始,然后必须将其读取到所需的图像数据,然后退出。数据位于文件末尾的图像需要更长的时间,这是有道理的。处理文件所需时间的突然增加可能与文件系统缓存有关。使用
awk
、或
Perl
或类似方法对文件进行单次遍历,并将其拆分为1000个图像,每个图像位于单独的文件中。您可以r解决方案真的很快。打印一张图像平均需要1.14秒。但我不知道那里发生了什么。你能解释一下你的代码的一些细节吗?@Samuel我在我的回答中添加了一个简短的解释。你的解决方案非常简单,我的gnuplot脚本现在运行速度非常快。每张图像大约需要1.1秒。太棒了!
split -a 4 -d -l matrix_size data matrix-