PostScript хранит большие объемы данных - PullRequest
0 голосов
/ 07 июня 2018

Я создаю программу PostScript, которая должна обрабатывать до десяти миллионов точек данных.У меня проблемы с хранением этих данных в файле.Вот упрощенная версия того, что у меня сейчас есть:

% (данные и вызовы процесса)
точка данных 1 точка данных 2 ... точка данных n процесс
точка данных n + 1 точка данных n + 2 ... точка данных 2n процесс
...
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

тогда я смогу выполнить оба типа обработки следующим образом:
/ mode 1 def processData
/ 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

Однако это тоже не работает, поскольку массивы также имеют максимальную длину.Затем я попытался закодировать данные в виде символов и поместить их в строку, но строки также имеют максимальную длину.Я рассматриваю возможность использования массива строк, но подозреваю, что есть лучший способ сделать это.

Как это можно сделать?Спасибо.

1 Ответ

0 голосов
/ 08 июня 2018

Я думаю, что комментарий Кена является хорошей идеей, поэтому этот ответ немного уточнит.

Вы можете поместить свои точки данных во внешний файл и получить к ним доступ в основной программе несколькими различными способами.,Предполагая, что файл называется 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-элементных массивов.Нет ограничений на уровень вложенности, который вы можете иметь.Фактически массив может содержать сам себя, в действительности бесконечное вложение .

Если у вас есть 10 миллионов, вы можете иметь 3 уровня: 10 x 1000 x 1000

[
  [
    [ n0 ... n999  ]
    [ n1000 ... n1999 ]
    ...
    [ n999000 ... n999999 ]
  ]
  [
    [ n1000000 ... n1000999 ]
    ...
  ]
  ...
  [
    [ n9000000 ... n9000999 ]
    ...
    [ n9999000 ... n9999999 ]
  ]
]
...