Postscript хранит большие объемы данных

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

% (данные и вызовы для обработки)
точка данных 1 точка данных 2 ... точка данных n процесс
точка данных n +1 точка данных n + 2 ... точка данных 2n процесс
...
точка данных (m-1) n + 1 ... точка данных mn процесс

Процесс - это функция, которая берет точки в стеке и выполняет над ними вычисления, в результате чего на странице рисуются различные линии. Поскольку в стеке есть максимальное количество точек, которые могут быть помещены в него, я должен разбить данные на части для обработки. Это нормально, но я бы хотел обработать эти данные дважды двумя разными способами (а позже, возможно, более чем двумя способами). Мой первоначальный план заключался в следующем. У меня было бы 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

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

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


person Mathew    schedule 07.06.2018    source источник
comment
Похоже, вам просто нужно, чтобы данные хранились в файле, и программа PostScript считывала их оттуда. Я не вижу смысла хранить данные как часть программы. Вы можете использовать оператор «токен» для чтения объектов PostScript из файла, так что вы можете просто хранить данные как (я полагаю) числа.   -  person KenS    schedule 07.06.2018


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

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

[
  [
    [ n0 ... n999  ]
    [ n1000 ... n1999 ]
    ...
    [ n999000 ... n999999 ]
  ]
  [
    [ n1000000 ... n1000999 ]
    ...
  ]
  ...
  [
    [ n9000000 ... n9000999 ]
    ...
    [ n9999000 ... n9999999 ]
  ]
]
person luser droog    schedule 08.06.2018