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

问题描述:


我有一个应用程序,它在初始化时创建一个图并在该图上执行所有对最短路径并稍后使用结果。快速读取和写入数据到文件

如该图是相当大的,这需要相当多的时间10-12分钟,这是我创建图形是相同的,每次,这样我就可以一次计算矩阵,倾倒并重复使用以后。

然而,这是有意义的仅当所用的时间来读取阵列到内存较小和阵列可以具有多达35M元件。(每1个字节,35M)

是否有一些快速的方式倾倒/读取数据,以实现这一目标。

谢谢

+1

HDD的典型速度为60-100Mb/s。 – ruslik 2011-01-24 06:48:03

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

与文件系统的大多数操作系统,增加了文件缓存可以显着提高文件的读写性能。默认情况下,C++和C运行时库使用大约512或1024字节的缓冲区。将缓冲区增加到您的应用程序的1到40 MB附近的某个位置。

提高性能的另一种方法是重新考虑数据结构。也许它可以变得更小和/或具有更好的参考地点。彼此靠近的项目更可能已被缓存或缓存。

实际上是否需要写一个文件呢?

+0

所以你的意思是硬代码呢? – sud03r 2011-01-24 09:03:31

在某些时候,你会遇到硬盘驱动器的速度上限。

,可以做最简单的优化是提高从您正在阅读的硬件。一种选择是购买solid-state drive。或者,您可以制作一个RAM disk,您可以从中读取您的数据。这些任何一个应该不用太多的努力就能显着提高速度,而不依赖于编程语言。

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

如果你知道你在运行该计算机将不会改变 - 或者你不需要它是便携式的,你可以尝试做一个深度优先遍历和写作每个节点的二进制文件。

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

阅读会是相反的

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

你可以考虑使用升压序列化更自动化的解决方案。我从来没有使用它,只是提到它在传递

由于图始终是相同的,你可以硬编码它到你的程序。

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