2010-05-29 18 views
0

我想提供一个访问器,它提供了一个STDIN的NSInputStream类,它可能有几百兆字节(或千兆字节,尽管可能不太可能)的数据。处理潜在的大型STDIN数据,不止一次

当调用者得到这个NSInputStream时,它应该能够读取它,而不用担心用尽它所包含的数据。换句话说,另一个代码块可能会请求NSInputStream,并希望能够读取它。如果不先将所有的数据拷贝到一个NSData对象中(我认为这会导致内存耗尽),那么我的处理这个选项的选项是什么?返回的NSInputStream不一定是相同的实例,它只需要提供相同的数据。

我现在想出的最好的方法是将STDIN复制到临时文件,然后使用该文件返回NSInputStream实例。这是几乎处理它的唯一方法吗?如果我走临时文件路线,有什么我应该谨慎的吗?

编辑|我应该提到,它不是实际上是 STDIN,这是在一个多线程的FastCGI应用程序中,它是来自STDIN的FCGX_Request.in流。

回答

2

当读取从管道或插座的数据,你有三种选择:

  • 过程中它并忘记它。
  • 将它添加到内存中的完整记录并在此之前或之后处理它。
  • 将其添加到一个完整的文件,并在此之前或之后处理它。

这是完整的清单。除了短期或长期存储之外,没有其他地方可以记录它,所以您可以对读取的数据做的唯一其他事情就是根本不记录它。

再次获取数据的唯一方法是发送给您的任何信息再次发送。

+0

非常好,谢谢,我需要自己处理数据,然后再次将其提供给消费者,所以我认为我会随我的第一本能而写入临时文件。 – d11wtq 2010-05-29 07:18:49