不止一次地处理潜在的大型STDIN数据

时间:2010-05-29 03:31:39

标签: objective-c cocoa stdin nsinputstream

我想在一个为STDIN提供NSInputStream的类上提供一个访问器,它可能是数百兆字节(或者几千兆字节,但可能不太可能)。

当调用者获取此NSInputStream时,它应该能够从中读取而不必担心耗尽它包含的数据。换句话说,另一个代码块可能会请求NSInputStream,并希望能够从中读取它。

首先将所有数据复制到NSData对象中(我假设)会导致内存耗尽,我可以选择处理这个问题吗?返回的NSInputStream不必是同一个实例,它只需要提供相同的数据。

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

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

1 个答案:

答案 0 :(得分:2)

从管道或套接字读取数据时,有三个选项:

  • 处理它并忘记它。
  • 将其添加到内存中的完整记录中,然后在执行此操作之前或之后对其进行处理。
  • 将其添加到完整文件中,然后在执行此操作之前或之后对其进行处理。

这是完整的清单。除了短期或长期存储之外,没有其他地方可以记录它,因此您可以对所读取的数据执行的唯一其他操作就是不记录它。

再次获取数据的唯一方法是将其发送给您再发送一次。