【问题标题】:postscript store large amounts of datapostscript 存储大量数据
【发布时间】:2018-06-08 09:17:10
【问题描述】:

我正在创建一个 postscript 程序,它需要能够处理多达一千万个数据点。我无法将此数据存储在文件中。这是我现在所拥有的简化版本:

%(数据和进程调用)
datapoint1 datapoint2 ... datapointn 进程
数据点n+1 数据点n+2 ... 数据点2n 进程
...
数据点(m-1)n+1 ...数据点mn进程

Process 是一个函数,它获取堆栈上的点并对其进行计算,从而在页面上绘制各种线条。因为堆栈有最大数量的点可以放在上面,所以我必须将数据分成块进行处理。这很好,但是我想以 2 种不同的方式处理此数据两次(稍后,可能超过 2 种方式)。我最初的计划是做以下事情。我将有 2 个函数,process1 和 process2,并且 process 函数将被替换为:

/process{
  mode 1 eq{process1}if
  mode 2 eq{process2}if
} def

然后我会将整个数据列表和对流程函数的调用放入另一个名为“processData”的函数中,例如这样。

/processData{
  datapoint1 ... datapointn process  
  ...
  datapointnm process
}def

那么我就可以像这样进行这两种类型的处理:
/mode 1 def 进程数据
/mode 2 def processData

这样做的好处是我不需要再次写出所有数据,这会占用太多空间,尤其是当我需要执行多个进程(而不仅仅是 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

但是这也不起作用,因为数组也有最大长度。然后我尝试将数据编码为字符并将其全部放在一个字符串中,但字符串也有一个最大长度。我正在考虑使用字符串数组,但我怀疑有更好的方法。

如何做到这一点?谢谢。

【问题讨论】:

  • 听起来您真的只是想要将数据存储在文件中,然后让 PostScript 程序从那里读取它。我看不出有任何理由将数据存储为程序的一部分。您可以使用“令牌”运算符从文件中读取 PostScript 对象,因此您可以将数据存储为(我认为)数字。

标签: postscript


【解决方案1】:

我认为肯的评论是个好主意,所以这个答案是充实一点。

您可以将数据点放在外部文件中,并在主程序中以几种不同的方式访问它。假设文件名为datapoints.ps,您可以使用run 运算符来读入文件。

/mode 0 def  (datapoints.ps) run
/mode 1 def  (datapoints.ps) run

或者您可以从文件中读取“块”并单独处理它们。一次一个数字:

/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 ]
  ]
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2019-07-28
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多