以前,我要求的 的问题.

问题是要求我们的文件的结构是非常高的。

例如,我们正在试图创建一个容器与达到4500文件和500兆的数据。

该文件结构的这一容器由

  • 源码DB(在1mb)
  • 案文基于xml-像文件
  • 图像里面的动态文件夹结构,使其余的4 500名左右的文件

  • 在初始创作的图像文件的只读除删除。

  • 该小数据库是定期使用当的容器进行访问。

焦油、邮政编和喜欢的都太缓(甚至0压缩)。慢是主观的,我知道,但要解压容器中的这个尺寸超过20秒。

任何想法?

有帮助吗?

解决方案

三件事情。

1)什么样的蒂莫西*沃尔特斯所说的是正确的,我会去到更详细的说明。

2)4500文件和500兆的数据只是一个很大的数据和盘写入。如果你正在操作上的整个数据集,这将是缓慢的。只I/O真相。

3)如其他人已经提到,没有详细使用情况。

如果我们假设一个只读,随机访问情况,那么什么Timothy说是相当多的死亡,并执行是直接的。

简而言之,在这里为你做什么。

你连接所有的文件在一个单一的blob。而你连他们,你跟踪他们的文件,文件长度和所抵消,该文件启动内blob。你写的信息在一块的数据,按名称。我们就叫这个表格的内容,或TOC块。

接下来,然后,你连接这两个文件合在一起。在简单的情况,你有TOC块,然后该数据块。

当你希望得到的数据,从这个格式,搜索目录的文件的名字,抢偏从一开始的数据块,增加在目录块的大小,并宣读FILE_LENGTH字节的数据。简单的。

如果你想的要聪明,可以把目录结束时blob文件。然后,附加在该最后,偏向开始的目录中。然后你lseek到该文件的结束,回到了4个或8个字节(这取决于你的数量大),采取这种价值和lseek甚至更远回到一开始你的目录。然后你就回到广场之一。你这样做你不必重建档案的两倍,在开始。

如果你放了你的TOC在块(说1K字节的大小),然后你可以很容易地执行二上的搜索目录。简单地填写每个方框,与文件信息条目以及当你的室,写标记,垫用零,并推进到下一块。做二进制的搜索,你已经知道的大小目录,开始在中间,阅读该文件第一名,并从那里走。很快,你会找到的区块的,然后你读块和扫描的文件。这使得有效的阅读,而不必整个TOC在RAM。其他好处是,需要阻止小磁盘活动,比链接方案喜欢焦油(在那里你必须爬档案以找到的东西).

我建议你垫的文件,方框的大小以及磁盘等的工作与普通大小的块的数据,这并不困难。

更新本没有重建整个事情是困难的。如果你想要一个可更新容器系统,然后你可以看到一些简单的文件系统的设计,因为这是你真的在寻找在这种情况。

为了便携性,我建议你保存你的二进制数字网络的顺序,因为大多数标准图书馆有程序来处理那些细节。

其他提示

因为你似乎可以做任意文件系统操作上的容器(说,创建、删除的新的文件,在容器,复盖现有的文件,追加),我认为你应该去的一些类型的文件系统。分配一个大文件,然后建立一个文件系统的结构。

有几个选项文件系统:为伯克利分校UF和Linux ext2/ext3,有的用户模式库。这可能也是可能的,你找到一个胖胖的执行情况的地方。确定你明白的结构文件系统,并且挑选一个允许对延伸-我知道,ext2是相当容易扩展(通过另一区块群组),并且肥胖是难以延长(需要追加的脂肪)。

或者,可以把一个虚拟盘格式,但以下文件系统,允许任意重的区块。然后"免费"块的文件系统不需要出现在磁盘,以及可以分配的虚拟盘远大于实容器的文件会。

工作假设你只是需要的只读访问,文件为什么不只是把它们合并在一起,并有第二个"指标"的文件(或一种指数的标题),告诉你的文件名称、启动的位置和长度。所有你需要做的是寻求的起始点和读取正确的数字节。该方法将根据你的语言,但它相当直接在大多数。

最难的部分后来成为创建数据文件+索引,甚至是非常基本的!

ISO磁盘图像可能做到。它应该能够举行,许多文件很容易,并支持由许多碎片的软件,在所有主要操作系统。

首先,感谢您为扩大你的问题,它有很大帮助,提供更好的答案。

鉴于你需要一个源码数据库,无论如何,你有没有看着的性能,把它的所有进入数据库?我的经验是基于SQL服务器2000/2005/2008所以我不积极的能力的源码但我肯定这将是一个非常快的选择看起来记录和获取数据,同时仍然允许的用于删除和/或更新选择。

通常我不会建议把文件内的数据库,但是鉴于总的尺寸大小的所有图像是周围500兆为4500图像你们看到的只是一个小100K每图像对吗?如果你使用一个动态的路径储存的图像,然后在一个稍微更加规范化的数据库,你可以有一个"ImagePaths"表,每个地图的路径一个ID,然后你可以看看图像,PathID和载荷的数据BLOB列需要。

在XML文件(s)还可以在源码数据库,这给你一个单一的数据文件'你的应用程序,可以移动之间的窗户和OS x没有问题。你可以简单地依靠你源码发动机提供的性和兼容性需要。

你如何优化这取决于您的使用情况,例如,如果你经常需要获得的所有图像在一定的道路然后有一个PathID(作为一个整数的性能)将是快速的,但是如果你们表示的所有图像,开始与"A"和简单的道路作为一个酒店然后一指数在映列将更多的使用。

我有点担心,虽然这听起来像是过早的最优化,因为你真的需要找到一个解决方案'的足够快'的,抽象的机制,它使你的应用程序(或这两个应用程序,如果你有两个Mac和电脑版本)使用一个简单的储存库中或类似的,然后你可以改变的存储、检索方法,在将没有任何影响到应用程序。

检查 固体文件系统 -这似乎是你需要什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top