1

我的程序应该将数百个文件写入磁盘,由外部资源(网络)接收每个文件都是一个简单的文档,我目前将其以 GUID 的名称存储在特定文件夹中,但创建数百个文件,写入,关闭是一个漫长的过程过程。

有没有更好的方法将这些数量的文件存储到磁盘?我已经找到了一个解决方案,但我不知道它是否是最好的。

首先,我创建了 2 个文件,其中一个类似于分配表,第二个是一个巨大的文件,用于存储我的文档的所有内容。但是从这个文件中读取将是一场噩梦。也许内存映射文件技术可以提供帮助。使用 30GB 或更多会产生问题吗?

编辑:在磁盘上存储 1000 个文本文件的最快方法是什么?(写操作频繁执行)

4

3 回答 3

2

您应该做的第一件事是分析您的应用程序。特别是您希望获得有关磁盘队列长度的计数器。您的队列长度不应超过您拥有的磁盘轴数的 1.5 到 2 倍。

例如,如果你有一个单磁盘系统,那么队列长度不应该超过 2。如果你有 3 个磁盘的 RAID 阵列,它应该超过 6。

验证您确实是写绑定的。如果是这样,那么提高执行大量写入性能的最佳方法是购买具有非常快写入性能的磁盘。请注意,大多数 RAID 设置会导致性能下降。

如果写入性能至关重要,那么将存储分散到多个驱动器上可能会奏效。当然,对于需要读取该信息的任何应用程序,您都必须考虑到这一点。而且您仍然必须购买快速驱动器。

请注意,并非所有驱动器都是平等的,有些驱动器比其他驱动器更适合高性能。

于 2011-01-10T19:49:24.217 回答
2

这类似于Subversion如何将其存储库存储在磁盘上。存储库中的每个修订都存储为一个文件,存储库为每 1000 个修订使用一个文件夹。这似乎表现得相当好,除非文件很有可能变得碎片化或彼此相距更远。Subversion 允许您将每个 1000 个修订文件夹打包到一个文件中(但这很好用,因为修订一旦创建就不会被修改。

如果您打算经常修改这些文档,您可以考虑使用嵌入式数据库来为您管理实体文件(Firebird是一个不错的,没有任何大小限制)。这样您就不必自己管理文件的增长和组织(当您开始修改实体文件中的文件时,这可能会变得复杂)。如果您使用单独的服务/进程来管理数据库并与之通信,这也将有助于解决并发访问(读/写)的问题。新版本的 Firebird (2.5) 支持对数据库的多进程访问,即使在使用嵌入式服务器时也是如此。通过这种方式,您可以对文件存储进行多次访问,而无需运行数据库服务器。

于 2011-01-10T14:09:01.783 回答
0

使用ThreadPool怎么样?

即,对于每个接收到的“文件”,将写入函数排入线程池线程中,该线程实际上将数据持久保存到磁盘上的文件中。

于 2011-01-10T13:49:55.310 回答