.net - 在磁盘中存储许多文件的最佳方法

标签 .net performance memory storage

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

  • 这是 .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/

相关文章:

c# - 使用 if 语句遍历数据表并修改值

c++ - 为什么在 glsl 中使用实例化时纹理缓冲区比顶点输入快?

memory - 在 SQL Server 2012 中看到高内存使用率

python - Django:上传的文件没有被垃圾收集,导致内存问题

java - 在Java中,如何分配给定数量的内存,并保留它直到程序退出?

c# - HttpRequestMessage 的 Content-Type header 中的奇怪行为

c# - WPF 中的 EndEdit 等效项

c# - WPF/XAML 中 Canvas 中的可重复形状

c# - 大数据量TreeView优化

javascript - 空的try catch如何影响性能?