快速读取和写入文件的数据

时间:2011-01-24 06:44:30

标签: c++ performance


我有一个应用程序,它在初始化时创建一个图形,然后在该图形上执行全对最短路径并稍后使用结果。

由于图表非常大,这需要大约10-12分钟的时间,而且我创建的图表每次都是相同的,所以我可以计算一次矩阵,转储并稍后重复使用。

然而,只有将数组读入内存所需的时间较少且数组可以有多达35M的元素时才有意义(每个1字节,35M)

是否有一些快速的转储/读取数据的方法,这是可以实现的。

由于

4 个答案:

答案 0 :(得分:2)

可用选项的数量取决于操作系统。在虚拟内存系统中,通常有一种方法可以将一部分内存空间映射到文件,并让它根据需要自动来回传输页面。

在大多数具有文件系统的操作系统中,增加文件缓冲区可以显着提高文件读取和写入性能。默认情况下,C ++和C运行时库使用大约512或1024字节的缓冲区。将缓冲区增加到适合您应用程序的1到40 MB附近。

提高性能的另一种方法是重新考虑数据结构。也许它可以做得更小和/或具有更好的参考局部性。彼此更接近的项目更有可能已经缓冲或缓存。

实际上是否有必要写一个文件?

答案 1 :(得分:0)

在某些时候,您将遇到硬盘的速度上限。

可以做的最简单的优化是改进您正在阅读的硬件。一种选择是购买solid-state drive。或者,您可以创建一个RAM disk,您可以从中读取数据。这些都可以在不需要太多努力的情况下显着提高速度,而与编程语言无关。

答案 2 :(得分:0)

是的,内存映射文件。您可以使用boost :: mapped_file来实现可移植性。

答案 3 :(得分:0)

如果你知道你正在运行的计算机不会改变 - 或者你不需要它是可移动的,你可以尝试进行深度优先遍历并将每个节点写入二进制文件。 / p>

fwrite( currNode, sizeof(Node), 1, out);

阅读将是相反的

Node theNode; fread(&theNode,  sizeof(node), 1, in);

您可以考虑使用boost序列化来实现更加自动化的解决方案。我从未使用它,只是顺便提一下

由于图表始终相同,因此您可以将其硬编码到程序中。

最雄心勃勃的解决方案是使用模板元编程技术重写图形。这允许您在编译时更改映射。它会给你的编译器带来巨大的负担,但会减少内存中的图形为运行时。