我找不到问题的好标题,这就是我想要做的:
- 这是 .NET 应用程序。
- 我需要存储多达 200000 个对象(3KB-500KB 之间)
- 我需要每秒从多线程中存储大约 10 个
- 我在存储之前使用二进制序列化
- 稍后我需要通过一个唯一的整数 ID 访问它们
最好的方法是什么?
- 我无法将它们保存在内存中,因为我会遇到内存不足异常
- 当我将它们作为单独的文件存储在磁盘中时,可能会出现哪些性能问题?它会大大降低整体性能吗?
- 我是否应该实现某种缓存,例如组合 100 个对象并将其作为一个文件写入一次。然后稍后解析它们。或者类似的东西?
- 要使用数据库吗? (访问时间并不重要,不会有搜索,我只会通过已知的唯一 ID 访问几次)。理论上我不需要数据库,我不想让这个复杂化。
更新:
- 我认为数据库会比文件系统慢,如果您对此有所了解,请证明我错了。所以这就是为什么我也倾向于文件系统。但我真正担心的是每秒将 200KB*10 写入硬盘(这可以是任何硬盘,我不控制硬件,它是一个桌面工具,将部署在不同的系统中) .
- 如果我使用文件系统,我会将文件存储在单独的文件夹中以避免与文件系统相关的问题(因此您可以忽略该限制)
最佳答案
如果您想避免使用数据库,您可以将它们作为文件存储在磁盘上(为了简单起见)。但是在单个目录中维护大量文件时,您需要注意文件系统注意事项。
许多常见的文件系统在某种顺序列表中维护每个目录的文件(例如,简单地将文件指针或 inode 一个接一个地存储,或者存储在链表中。)这使得打开位于底部的文件列表真的很慢。
一个好的解决方案是将您的目录限制为少数节点(例如 n = 1000),并在目录下创建一个文件树。
所以不要将文件存储为:
/dir/file1/dir/file2/dir/file3 .../dir/fileN
将它们存储为:
/dir/r1/s2/file1/dir/r1/s2/file2 .../dir/rM/sN/fileP
通过这种方式拆分文件,您可以显着缩短大多数文件系统的访问时间。
(请注意,有一些新的文件系统表示树中的节点或其他形式的索引。这种技术也适用于这些。)
其他考虑因素是调整文件系统( block 大小、分区等)和缓冲区缓存,以便获得良好的数据局部性。根据您的操作系统和文件系统,有很多方法可以做到这一点 - 您可能需要查找它们。
或者,如果这不能解决问题,您可以使用某种嵌入式数据库,如 SQLlite 或 Firebird。
HTH。
关于.net - 在磁盘中存储许多文件的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2229911/