如何在内存中保存未知量的数据?

How to save an unknown amount of data in memory?

提问人:user129393192 提问时间:6/15/2023 更新时间:6/15/2023 访问量:64

问:

我之前在这里发过帖子,但根据评论,我的想法是错误的。我的问题很清楚:当从流中读取时,传入的字节数未知,将数据保存在内存中以备后用的最佳方法是什么?

以下是我的一些想法:

  • mmap一个不冲突的内存区域,必要时会更多(缺点:管理起来可能很烦人)mmap
  • 创建一个缓冲区的链接列表结构,在分配下一个缓冲区之前填充每个缓冲区(可能易于管理,因为我编写了 API)
  • (在堆栈上)分配一个指向此类缓冲区的指针数组(例如 100,使用 分配),并希望您没有超过(100 * 缓冲区大小)的数据来读取(最简单但最不可靠的解决方案)malloc

我的想法是,另一个被严重拒绝的帖子是:

  • 弄乱和做我自己的连续堆(然后可能会与任何使用的人发生冲突 - 尽管我个人不介意这一点,因为我只将 API 用于此应用程序,并且这是一个学习项目)sbrkbrkmallocmallocunistd

有没有一种标准方法(甚至一个特定的函数)来解决这个特定的问题:需要读取未知数量的数据并将其保存在内存中,你如何保存它?

C 内存管理 malloc posix mmap

评论

0赞 Craig Estey 6/15/2023
我只是回答了类似的事情:避免在 C 编程中为串联分配大量内存
0赞 Erdal Küçük 6/15/2023
根据我对这个问题和你之前问题的了解,这似乎是你最好的选择。要么实现单个缓冲区(必要时重新分配),一个缓冲区列表(为每个新块重新分配指针缓冲区,然后为每个块重新分配一个新区域),或者在内存不足之前,环形缓冲区将是更好的选择(与第二个选项相同,但在这种情况下,您将覆盖较旧的条目 - 当然,前提是这是一个选项, 否则,您必须考虑将数据交换到文件或其他东西中)。reallocmalloc
1赞 Erdal Küçük 6/15/2023
为什么要乱搞 AND IF 和朋友已经这样做了,而且可能比你能做的要好得多。brksbrkmalloc
0赞 John Bayko 6/15/2023
如果你用 C++ 或 golang 或其他具有列表或向量等集合的现代语言执行此操作,你会想要一个使用链表之类的东西(否则复制和调整缓冲区大小的开销会太多)。我建议对 C 语言使用相同的方法,使用链表(没有语言标准,但有很多示例可以复制)。
0赞 user129393192 6/15/2023
回复:“为什么要乱搞......”主要是因为我想学习如何去做。我还计划在某个时候编写自己的实现,但这并不是那么@ErdalKüçük。我是大学的学生。这似乎是一个不错的选择,因为大读取>缓冲区大小可能不是常见的情况(但我已经学会了始终努力实现稳健性)。我要么尝试一下,要么实现链表......感谢您的评论。我也@John Bayko,我知道还有其他一些人,但总是(现在)为实践写我自己的,这就是我使用 C 的原因。mallocreallocTAILQ

答: 暂无答案