Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 当以动画形式打印大数据集时,gnuplot速度较慢_Performance_File_Plot_Gnuplot - Fatal编程技术网

Performance 当以动画形式打印大数据集时,gnuplot速度较慢

Performance 当以动画形式打印大数据集时,gnuplot速度较慢,performance,file,plot,gnuplot,Performance,File,Plot,Gnuplot,我正试图从一个大的文本文件中用如下脚本绘制大量数据(1000个粒子的位置)的“动画”绘图: set terminal wxt size 1000,600 k=999999 N = 999 do for [i=0:k]{ plot for [j=0:N-1] "pos.txt" using 2*j+1:2*j+2 every ::2*i+1::2*i+1 ls 1 pt 7 ps 2 notitle 在文件中,每一行都有我要绘制的点在特定时间的坐标X和Y。我使用each将每行中的所有数据绘制一

我正试图从一个大的文本文件中用如下脚本绘制大量数据(1000个粒子的位置)的“动画”绘图:

set terminal wxt size 1000,600
k=999999
N = 999
do for [i=0:k]{
plot for [j=0:N-1] "pos.txt" using 2*j+1:2*j+2  every ::2*i+1::2*i+1 ls 1 pt 7 ps 2 notitle
在文件中,每一行都有我要绘制的点在特定时间的坐标X和Y。我使用
each
将每行中的所有数据绘制一次,然后移到下一行

输出如下(1000个粒子移动)

然而,绘图太慢了,我不知道我能做些什么使绘图更快。它每5秒或更长时间绘制一行。该文件的权重为MB。我应该换航站楼吗?还是我存储数据的方式?我认为gnuplot加载大文件时可能会出现问题。

一些粒子出现在模拟中,因此我还得到错误
第14行:警告:当索引
j
(井2j+1)超过粒子数时,跳过没有有效点的数据文件,但我尝试使其每次读取粒子数,速度甚至更慢。非常感谢。

我怀疑每次绘图时gnuplot都在读取整个文件,与之相反的是读取到所讨论的行,然后是下一行,然后是下一行,等等。一种可能的策略是将粒子轨迹分离到不同的文件中,但特别是,它可以通过简单的
plot
加上带有
every
的块选择来帮助删除
绘图,在该块中,不选择粒子的列,而是在同一块中的同一时间步中选择粒子的位置

现在,您的数据如下所示:

x1 y1 x2 y2 x3 y3 # Time step 1
x1 y1 x2 y2 x3 y3 # Time step 2
gnuplot需要为每个时间步长和粒子读取一次文件。如果文件结构如下(请注意块之间有一个空行):

然后您不需要为
绘制
,只需通过在每个
中插入一个额外分号来选择包含所有粒子的对应块:

set terminal wxt size 1000,600
k=999999
#N = 999 you don't need this anymore!
do for [i=0:k] {
plot "pos.txt" every :::i::i
}

<上面的代码读取每一个时间步的文件,而不是每一个时间步和粒子,并同时绘制所有的粒子。

如果性能非常关键,可以考虑使用完全不同的数据格式。虽然更改ASCII文件的格式会带来巨大的改进,但它的扩展性很差,因为gnuplot必须始终从数据文件的开头开始扫描,以确定从何处开始。我做了一些测试,绘制前1000帧需要60秒,而9000到10000点需要600秒

您需要一种数据格式,它允许您在固定时间内查找任何数据集。在我的论文中,我用保存了我所有的实验数据(巨大的数据集),然后您可以使用外部工具提取所需的数据集。这里,可以在不扫描整个文件的情况下计算所请求的数据集的位置,并且访问时间与帧编号无关

对于测试,我使用以下python脚本生成测试数据文件
points.h5

from numpy import random
import h5py
P = random.normal(size=(10000,1000,2))
f = h5py.File('points.h5', 'w')
f.create_dataset('points', data=P)
用于打印的gnuplot脚本是

set terminal wxt size 1000,600
k=9999
do for [i=0:9999]{
  plot sprintf("< h5totxt -s ' ' -x %d points.h5", i) using 1:2 ls 1 pt 7 ps 2 title sprintf("%d", i)
}
设置端子wxt尺寸1000600
k=9999
适用于[i=0:9999]{
使用1:2 ls 1 pt 7 ps 2标题sprintf(“%d”,i)绘制sprintf(“

现在,打印1000帧需要40秒,无论您使用哪一帧(0-1000或9000-10000)。

如果您只对最终动画感兴趣,可以将图像导出为gif或使用类似ffmpeg的内容生成视频。然后,播放将不受gnuplot处理数据文件的速度的限制,因此您可以以任何理想的帧速率查看动画。这是一个好主意,但是,由于gnuplot使用脚本绘制我想要的内容需要很长时间,因此完成动画需要几个小时,因此,即使我能全速观看动画,这仍然是一个问题。谷歌人可能也对我做的这项调查感兴趣,我对不同的绘图软件进行了1000万点的统计:结果非常好。然而,gnuplot如何读取第一个脚本中的数据?它是不是先到行
2i+1
然后绘制列
2j+1
2j+2
然后再到行
2i+1
等等?(因此它必须为每个粒子位置寻找同一条线,直到它绘制所有粒子)
set terminal wxt size 1000,600
k=9999
do for [i=0:9999]{
  plot sprintf("< h5totxt -s ' ' -x %d points.h5", i) using 1:2 ls 1 pt 7 ps 2 title sprintf("%d", i)
}