我正在创建一个需要能够处理多达一千万个数据点的postscript程序。我在将这些数据存储在文件中时遇到了麻烦。这是我现在所拥有的简化版本:
%(数据和对流程的调用)
datapoint 1 datapoint 2 ... datapoint n process
datapoint n + 1 datapoint n + 2 ... datapoint 2n process
...
datapoint (m-1)n + 1 ... datapoint mn process
进程是一种功能,它在堆栈上获取点并对它们进行计算,从而导致在页面上绘制各种线条。因为堆栈具有可以放在其上的最大点数,所以我必须将数据拆分成块以进行处理。这很好但是我想以两种不同的方式处理这些数据两次(后来,可能超过两种方式)。我最初的计划是做以下事情。我将有2个函数,process1和process2,并且过程函数将替换为:
/process{
mode 1 eq{process1}if
mode 2 eq{process2}if
} def
然后我将整个数据列表和调用过程函数放在一个名为“processData”的其他函数中,例如这样。
/processData{
datapoint1 ... datapointn process
...
datapointnm process
}def
然后我就可以这样处理两种类型的处理:这样做的好处是我不需要再次写出所有数据,这会占用太多空间,特别是一旦我需要进行多个处理(不仅仅是2个)。但这不起作用,因为就像堆栈一样,函数中可以存在的事物数量最大。
我的第二个计划是将数据放入一个数组中,然后像这样循环数据两次:
/array [datapoint1 datapoin2 ... datapointmn] def
1 1 n m mul {array exch get process1} for
1 1 n m mul {array exch get process2} for
但是这也不起作用,因为数组也有最大长度。然后我尝试将数据编码为字符并将其全部放在字符串中,但字符串也具有最大长度。我正在考虑使用字符串数组,但我怀疑有更好的方法可以做到这一点。
如何做到这一点?感谢。
答案 0 :(得分:0)
我认为肯的评论是一个好主意,所以这个答案就是把它充实一点。
您可以将数据点放在外部文件中,并以几种不同的方式在主程序中访问它。假设文件名为datapoints.ps
,您可以使用run
运算符来读入文件。
/mode 0 def (datapoints.ps) run
/mode 1 def (datapoints.ps) run
或者你可以阅读" chunks"从文件中分别处理它们。一次一个数字:
/f (datapoints.ps) (r) file def
{
f token not {exit} if
dup process1
dup process2
pop
} loop
一次排队:
/tokens {
{ token not {exit} if exch } loop
} def
/f (datapoints.ps) (r) file def
f 1000 string
{
{readline} stopped {
pop length 2 mul string
}{
not {exit} if
tokens
count copy process1
count copy process2
clear
f 1000 string
} ifelse
} loop
如果您知道需要处理的最大行长度,这可能会更简单。
我希望这会给你一些想法。问题中的描述有点模糊,因此您可以提供更多详细信息,这将有助于我们为您提供更好的建议。
另一个选项可能是数组数组。实现可能对数组的长度有限制。我实际上并不知道ghostscript的限制,因为我最近了解到它远远高于我认为的65536。但是说限制是50000.你有100000件物品。
因此将数据拆分为2个50000个元素的数组。您可以拥有的嵌套级别没有限制。实际上,数组可以包含自身,实际上是无限嵌套。
如果你有1000万,你可以有3个等级,10 x 1000 x 1000
[
[
[ n0 ... n999 ]
[ n1000 ... n1999 ]
...
[ n999000 ... n999999 ]
]
[
[ n1000000 ... n1000999 ]
...
]
...
[
[ n9000000 ... n9000999 ]
...
[ n9999000 ... n9999999 ]
]
]