将许多文件存储在磁盘中的最佳方法

dr.*_*vil 8 .net memory performance storage

我找不到问题的好标题,这就是我想要做的:

  • 这是.NET应用程序.
  • 我需要存储多达200000个对象(3KB-500KB之间)
  • 我需要从多线程每秒存储大约10个
  • 我在存储它之前使用二进制序列化
  • 我需要稍后通过整数唯一ID访问它们

最好的方法是什么?

  • 我无法记住它们,因为我会忘记内存
  • 当我将它们作为单独的文件存储在磁盘中时,可能存在的性能问题是什么?它会降低整体性能吗?
  • 我应该实现某种缓存,例如组合100个对象并将其作为一个文件写入一次.然后再解析它们.或类似的东西?
  • 应该使用数据库?(访问时间并不重要,不会有搜索,我只能通过已知的唯一ID访问几次).理论上我不需要数据库,我不想让这复杂化.

更新:

  • 我假设数据库会比文件系统慢,如果你对此有所了解就证明我错了.所以这就是为什么我也倾向于文件系统.但我真正担心的是每秒写入200KB*10的HDD(这可能是任何HDD,我不控制硬件,它是一个桌面工具,将部署在不同的系统中).
  • 如果我使用文件系统,我会将文件存储在单独的文件夹中,以避免与文件系统相关的问题(所以你可以忽略这个限制)

0xf*_*xfe 5

如果您想避免使用数据库,可以将它们作为文件存储在磁盘上(为了简单起见)。但是,在单个目录中维护大量文件时,您需要注意文件系统注意事项。

许多常见的文件系统在某种顺序列表中维护每个目录的文件(例如,简单地一个接一个地存储文件指针或索引节点,或者在链接列表中)。这使得打开位于列表底部的文件确实慢的。

一个好的解决方案是将目录限制为少量节点(例如 n = 1000),并在该目录下创建一个文件树。

因此,不要将文件存储为:

/dir/file1 /dir/file2 /dir/file3 ... /dir/fileN

将它们存储为:

/dir/r1/s2/file1 /dir/r1/s2/file2 ... /dir/rM/sN/fileP

通过以这种方式分割文件,您可以显着缩短大多数文件系统的访问时间。

(请注意,有一些新的文件系统表示树中的节点或其他形式的索引。该技术也适用于这些文件系统。)

其他考虑因素是调整文件系统(块大小、分区等)和缓冲区缓存,以便获得良好的数据局部性。根据您的操作系统和文件系统,有很多方法可以做到这一点 - 您可能需要查找它们。

或者,如果这不能解决问题,您可以使用某种嵌入式数据库,例如 SQLlite 或 Firebird。

HTH。