哪种方法最适合快速读取光驱的文件?

时间:2009-02-25 16:24:04

标签: c++ c file optical-drive

从硬盘驱动器读取文件时,mmap通常被认为是快速将数据存入内存的好方法。使用光驱时,访问需要更多时间,并且您需要担心更长的延迟。您使用什么方法/抽象来隐藏/消除尽可能多的光驱延迟和/或总加载时间?

5 个答案:

答案 0 :(得分:1)

通过从几个文件(最好是一个)顺序读取大量数据,最大限度地减少或消除搜索。

答案 1 :(得分:1)

首先,您必须记住,现代光驱正在快速读取顺序数据,但寻求数据仍然比HD慢很多。因此,如果您必须在一个大文件中寻找很多东西(例如,在500多MB文件中随机跳转),首先将整个500 MB复制到HD(进入临时文件)实际上可能会更快,这将在顺序,快速读取,对临时文件执行操作(因为在HD上访问时间快得多),如果你已经完成了它,就再次删除文件。

上述同样适用于小型和小型文件。使用几个大文件比使用许多小文件要快得多,因为每次从一个小文件切换到另一个小文件时,大量的搜索时间会让你再次头疼。这就是为什么光学媒体上的许多游戏都将游戏数据包装在巨大的存档文件中(例如,一个级别的所有纹理都在一个巨大的文件中,而不是每个纹理有一个小文件),所以尝试将数据保存在大文件中你可以尽可能顺序阅读。

高清缓存本身就是一种很好的技术。我记得有这个游戏,虽然我忘记了标题,但始终保持环境的3D数据在高清上。当你在世界各地移动时,它不断地将数据从DVD复制到HD。因此,周围的3D景观始终可用于高清以便快速访问,但是并非整个DVD被复制,只有大约200-300 MB被临时缓存在高清上以节省高清空间。唯一令人讨厌的事情是你在玩游戏时经常有DVD访问“噪音”,但大多数时候整个过程只在CPU空闲时间发生,所以它并没有真正影响游戏。只有当你在同一方向上不断跑得非常快时才会发生DVD驱动器倒退,突然间游戏因装载指示器停止了几秒钟。然而,我已经玩了几天这个游戏,也许在一周内看到这个加载指示三次。如果你移动缓慢或不经常朝同一方向移动,那么从来没有一个加载指示器。

答案 2 :(得分:1)

你无法使用真正的抽象。光驱具有非常特殊的特性,必须进行优化才能获得最佳性能。

一些提示:

光驱上最大的杀手就是寻求时间。在可能的情况下,确保您正在阅读的所有文件都是顺序存放在光盘上并尽可能紧密包装。如果你必须寻求,那么尽可能在一个方向和不经常寻求。

异步读取也可以大大提高性能。如果您需要加载和处理文件A,B& C然后在处理A之前你应该开始读取文件B,而在处理B时你应该读取文件C,依此类推。

通常,您可以在一个中读取的数据越多越好,例如避免大量的小读取()。您只能在读取大量数据时获得光盘的理论吞吐量。一些操作系统/驱动程序将通过缓存扇区来最小化读取大量小文件的惩罚,有些则不会。

执行大量的存在(文件名)检查对某些文件系统/操作系统也是有害的,其中只有部分TOC被缓存。

在我们的应用程序中,我们通常将文件打包成一个或多个“集总”文件,并根据其访问顺序依次对它们进行排序。某些文件(和目录)在内存中解压缩之前会被完整地压缩和读取。如果您的目录包含大量小文件(例如XML或脚本),则可以获胜。

基本上有很多基准测试和调整:)

答案 3 :(得分:0)

慢速驱动器会很慢。抱歉。但是,光驱硬件通常会进行优化以进行顺序读取,因此如果您可以使代码以这种方式工作,您可能会看到一些改进。我怀疑你会发现mmap()fread()等人之间在顺序访问方面存在很大差异。如果您的操作系统尚未为您执行此操作,您也可以将读取缓冲区大小调整为驱动器块大小的倍数。与硬盘驱动器相比,光驱可以具有较大的块大小,如果缓冲区不够大,则需要付出代价。

答案 4 :(得分:0)

我不确定在你阅读它的时候你可以做很多事情。您可以查看创建文件API - 您可以向Windows传递一些提示,告诉它您正在打开顺序或随机访问文件。这应该允许Windows优化用于文件的缓存策略。

您可以在阅读文件时调整您咬掉的“块”,使其变大或变小。如果您读取的磁盘是磁盘上分配单元大小的倍数,则可能会略有改进。

硬件和媒体可以发挥作用。假设您的DVD驱动器读取速度为16x。它将需要额定为16倍或更高的媒体,并且某些驱动器与某些媒体品牌不兼容。因此,即使媒体符合评级,您也可能无法以最快速度阅读。 (通常在光驱上进行良好的硬件审查将包括这样的细节)。

光盘上文件的布局可能很重要。它一下子烧了吗?它只是作为磁盘安装(如数据包模式R / W?)。我没有这方面的经验,但考虑到光驱的寻道时间较长,碎片文件可能比现代硬盘驱动器产生更大的影响。