如何预测 pgfplots 内存过载?

如何预测 pgfplots 内存过载?

我有一些合法的数据集,它们会使 TeX 可用的内存超载。当然,建议的步骤是减少数据点的数量,而不是更改“主内存大小”。(在我的例子中,溢出发生在级别上,axis因为产生溢出的主要原因是共存曲线的数量。)问题是,是否有人找到了一个经验法则,即占用整个默认可用内存的数据集的大小是多少?

点数能判断内存是否已满吗?字符数是否包含在环境中coordinates?点数乘以曲线数是否能绘制数据中给定的点?

具体来说,一个no markers样式中最多可以绘制多少个点?

这个想法是,人们可以(例如通过编程)提前告知是否可以绘制某个集合,并根据该集合对数据进行重新采样。

答案1

PGFPlots 在其轴环境内分配存储如下:

对于每个地块,它都维护元数据,元数据在各个地块之间不会有太大差异(除非提供的选项数量差别很大)。元数据还包含cycle list信息。

除了这个恒定的开销之外,pgfplots 的当前版本会存储每个图的坐标。默认情况下,这包括 x、y、z(如果有)和元数据(如果有颜色数据)坐标。每个坐标都存储为浮点数,并且会存储任何数字(根据您提供的位数线性缩放)。

我认为一个好的估计方法是取点数、每个点要存储的坐标数(对于没有颜色数据的 2d 图,存储 2 个坐标;对于 3d 图,存储 1 个坐标;如果需要颜色数据,存储 1 个坐标)以及每个坐标的位数。no markers从 pgfplots 的角度来看,这可以确定具有样式的图的内存使用情况。

但是,pgf 还会分配内存:它分配​​排版各个线条所需的低级 pdf 流数据。对于没有标记和单独着色的线段的线图(直线,没有平滑处理),这将归结为两个固定点数加上一个常数个字符(括号、逗号、一个用于 line-to 运算符的字符)。固定点数将有 3 到 11 个字符。

请注意,pgf 的这个系统级缓冲区还存储了轴的任何绘制命令。在大多数情况下,这可以视为“恒定开销” - 我猜它不会影响建议的重采样控制。

我希望这能深入地回答这个问题。我认为 pgfplots 主要消耗“主内存大小”,但如果您需要更多信息,可能还需要分析 TeX 的其他内存类型。

但是正如我在上面的评论中提到的那样,我宁愿建议增加主内存大小(pgfplots 手册包含有关如何操作的详细说明),而不是尝试半自动下采样只是为了让 TeX 满意(特别是考虑到主内存大小的系统默认值在 TeX 发行版之间有所不同,并且将来可能会发生变化)。

相关内容