在内存中操作数据而不是文件

时间:2010-07-10 16:02:17

标签: c++ memory file redirect

考虑以下功能:

int Func(char* filename);
int Func(FILE* filepointer);

这两个做同样的事情,从给定文件(通过名称或指针)读取大量数据,分析他的结果,并返回它。 我想用很多不同的数据来调用这个函数。因此我应该将数据写入文件,然后将新文件名传递给Func。但数据量巨大,读写困难非常缓慢。实际上分析时间远远小于I / O.

我可以通过任何方式一直摆脱保存/加载数据吗? 例如,通过制作指向内存中某处的FILE *指针?

更新:显然我没有Func的源代码!这是一个DLL调用。

2 个答案:

答案 0 :(得分:2)

您可以使用memory-mapped文件技术或类似boost::iostreams的内容与自定义内存接收器/来源。

实际上,第二种变体更灵活,但有时候根本不需要灵活性和可塑性。

答案 1 :(得分:0)

在许多操作系统中,您可以使用内存文件系统,例如tmpfs - 并在Windows中使用“临时文件”(使用适当的标志打开,然后重新打开而不是关闭)表现相似(即可以留在记忆中。)

然而,与写入(有大量缓冲)和从非碎片磁盘顺序读取(同上)相比,没有那么多可以获得的东西,对于大型文件 - tmpfs的性能优势主要针对小型文件。如果你的表现非常糟糕,要么磁盘碎片严重,或者(可能更有可能是自调整文件系统的那些日子)你使用适当的缓冲(可能只是没有缓冲)。 (当然,这两个因素都可以发挥作用)。毕竟,现代设备和文件系统在向内存和内存传输大量缓冲区时可以拥有出色的性能。

对于专门用于缓冲的给定数量的RAM,如果该RAM位于应用程序地址空间的用户空间(而不是内核中),则可以获得更好的性能(从应用程序级别看起来像大量的微小写入和读取)控制,例如在tmpfs中),仅仅是因为你需要更少的上下文切换 - 并且从用户切换到内核模式并且当所执行的唯一其他操作是来回的少量内存的副本时,往往会支配运行时。当您在应用程序的stdio库中使用非常大的缓冲区时,您的“I / O”相当于地址空间内的用户区内存内存副本,并且非常罕见的“流”操作实际上来回传输这些缓冲区。