多次处理潜在的大型 STDIN 数据

发布于 2024-09-03 06:13:57 字数 463 浏览 7 评论 0原文

我想在一个类上提供一个访问器,该类为 STDIN 提供 NSInputStream,这可能是几百兆字节(或千兆字节,尽管可能性不大)的数据。

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

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

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

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

I'd like to provide an accessor on a class that provides an NSInputStream for STDIN, which may be several hundred megabytes (or gigabytes, though unlikely, perhaps) of data.

When a caller gets this NSInputStream it should be able to read from it without worrying about exhausting the data it contains. In other words, another block of code may request the NSInputStream and will expect to be able to read from it.

Without first copying all of the data into an NSData object which (I assume) would cause memory exhaustion, what are my options for handling this? The returned NSInputStream does not have to be the same instance, it simply needs to provide the same data.

The best I can come up with right now is to copy STDIN to a temporary file and then return NSInputStream instances using that file. Is this pretty much the only way to handle it? Is there anything I should be cautious of if I go the temporary file route?

EDIT | I should mention, it's not actually STDIN, this is in a multithreaded FastCGI application and it's the FCGX_Request.in stream which did come from STDIN.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅忆 2024-09-10 06:13:57

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

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

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

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

When reading data from a pipe or socket, you have three options:

  • Process it and forget it.
  • Add it to a complete record in memory and process it before or after doing so.
  • Add it to a complete file and process it before or after doing so.

That's the complete list. There's nowhere else to record it but short-term or long-term storage, so the only other thing you can do with data you read is to not record it at all.

The only other way to get the data again is for whatever sent it to you to send it again.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文