【问题标题】:One large file, or several small files?一个大文件,还是几个小文件?
【发布时间】:2015-07-12 21:50:19
【问题描述】:

我正在将 3D 模型数据写入文件,同时包含许多不同类型的信息(网格、纹理、动画等),大小约为 50 到 100 mb。

我想将所有这些都放在一个文件中,但如果我只需要读取该文件的一小部分来获得我想要的内容,恐怕会花费我。

我应该为此使用多个较小的文件,还是一个非常大的文件可以?我不知道文件系统如何处理试图跳过巨型文件,所以就我所知,遍历一个大文件可能代价高昂,或者根本没有问题。

另外,如果使用单个大文件,我有什么特别需要做的吗?

【问题讨论】:

  • I don't know how the filesystem treats trying to jump around giant files, so for all I know iterating through a large file may either be costly, or no problem at all. 跳来跳去与从头到尾阅读所有内容直到某个特定位置不同。跳跃是可以的。
  • 在这种情况下什么算“非常大”?
  • @MatsPetersson - 大约 50mb。它不是......我猜它很大,但它是我经常使用的最大文件大小
  • FWIW Quake 使用 zip 文件执行此操作。尽管它使用多个 zip 文件和某种虚拟 fs 来解析路径。对于每张地图,它只从 zips 加载它想要的内容。我想使用 zip 文件可以解决索引问题以定位特定数据。

标签: c++ filesystems stdio


【解决方案1】:

访问文件中间的数据没有问题 - 操作系统不需要读取整个文件,它可以轻松地跳到任何点。复杂之处在于您需要提供一个可以读取的索引,以识别各种数据的位置。

例如,如果您想读取特定的动画,您需要一种方法来告诉您的程序该数据在文件中的什么位置。一种方法是在文件的开头存储一个索引结构,您的程序将读取该结构以找出所有数据的位置。然后它可以在这个索引中查找动画,发现它在位置 24680 并且是 2048 字节长,然后它可以寻找到这个位置来读取数据。

如果您不熟悉在文件中查找,您可能需要查找 fseek 调用:http://www.cplusplus.com/reference/cstdio/fseek/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多