我有一个数据库的实现,每个记录有一个文件,我有大约10000条记录。 我正在尝试优化访问文件的性能,我有点怀疑。
将文件拆分成文件夹更好然后将所有文件保存在单个文件夹中,以便快速访问文件吗?例如:文件夹0中的0到999,等等中的1000到1999 ......
对此有什么好处, FAT16 或 FAT32 ?
答案 0 :(得分:2)
如果您直接访问这些文件,那么您将无法获得任何性能下降。如果要在磁盘上搜索特定文件,将它们存储在文件夹中会更快。这样文件夹就可以模拟db索引。但正如@blow所说,为什么不使用像Sqlite这样的东西?
答案 1 :(得分:0)
当您retrieve a file by filename
最有可能在包含该文件的目录中进行线性搜索时,您将跳过所有目录条目,直到找到与给定文件名匹配的目录条目。
如果每次为每个文件执行此操作,此搜索操作可能会很慢,目录中有许多文件并且读取速度很慢(如果CPU速度慢,则会丢失更多)。
您可能希望构建某种索引,即按文件名排序的紧密对filename+location
数组,您可以将其保留在内存中以快速查找不重读目录条目的文件。
如果文件数量恒定并且长度相同或填充到相同长度,则可以大大简化事情。在这种情况下,您不需要任何搜索,因为您可以直接从文件名计算每个文件的位置,当然,前提是文件的顺序是固定的。
此上下文中FAT1x和FAT32之间唯一的实际区别是文件分配表的大小,即链接列表/链的集合,它告诉您哪些集群可以被文件/目录数据释放或占用,并告诉您哪个集群是给定的文件/目录中的下一个。在FAT32中,簇链元素是32位,比FAT16大2倍。如果使用的簇数很少(小于~64K),那么与FAT16相比,在遍历簇链时,您将从FAT32读取两倍的数据。此外,如果磁盘上有许多群集,在FAT32上找到一个免费群集(当你创建一个新文件/目录或增长一个现有群集时)可能会很慢(FAT32 AFAIR上最多可以有2 ^ 28对比2 ^ FAT16的16)。您不希望每次都从FAT的开头搜索空闲群集。你想保留一个指向你停止搜索的最后一个地方的指针,然后从那里搜索,然后在你到达FAT结束时转到FAT的开头。
答案 2 :(得分:0)
在目录中拆分它们(拆分号码取决于您的群集大小),如果可以,请不要使用LFN(LongFileName),因为它会降低您的操作速度。我也在研究嵌入式系统。我没有像你这样访问1000个文件,但我避免使用LFN(特别是出于版税原因)。