Обработка потенциально больших данных STDIN, более одного раза - PullRequest
0 голосов
/ 29 мая 2010

Я хотел бы предоставить метод доступа для класса, который предоставляет NSInputStream для STDIN, который может иметь несколько сотен мегабайт (или гигабайт, хотя вряд ли, возможно) данных.

Когда вызывающий получает этот NSInputStream, он должен иметь возможность читать его, не беспокоясь об исчерпании данных, которые он содержит. Другими словами, другой блок кода может запросить NSInputStream и ожидать, что он сможет читать из него.

Без предварительного копирования всех данных в объект NSData, который (я предполагаю) вызовет исчерпание памяти, каковы мои варианты обработки этого? Возвращенный NSInputStream не должен быть тем же экземпляром, он просто должен предоставить те же данные.

Лучшее, что я могу предложить прямо сейчас, - это скопировать STDIN во временный файл и затем вернуть экземпляры NSInputStream, используя этот файл. Это единственный способ справиться с этим? Есть ли что-то, с чем мне следует быть осторожным, если я пройду по пути временного файла?

РЕДАКТИРОВАТЬ | Я должен отметить, что это не на самом деле STDIN, это в многопоточном приложении FastCGI, и это поток FCGX_Request.in, который пришел из STDIN.

1 Ответ

2 голосов
/ 29 мая 2010

При чтении данных из канала или сокета у вас есть три варианта:

  • Обработать и забыть.
  • Добавить его в полную запись в памяти и обработать ее раньшеили после этого.
  • Добавьте его в полный файл и обработайте его до или после этого.

Это полный список.Записать его некуда, кроме кратковременного или долгосрочного хранения, поэтому единственное, что вы можете сделать с прочитанными данными, - это вообще не записывать их.

Единственный другой способ получить данныеопять за то, что послал вам, чтобы отправить снова.

...