我的程序应该将数百个文件写入磁盘,由外部资源(网络)接收 每个文件都是一个简单的文档,我目前将其存储在特定文件夹中的GUID名称,但创建了一百个文件,写入,关闭是一个漫长的过程。
有没有更好的方法将这些数量的文件存储到磁盘? 我已经找到了解决方案,但我不知道它是否是最好的。
首先,我创建了2个文件,其中一个是分配表,第二个是存储文档所有内容的巨大文件。但是阅读这个文件将是一场噩梦;也许内存映射文件技术可以帮助。可以使用30GB或更多产生问题吗?
编辑:在磁盘上存储1000个文本文件的最快方法是什么? (写操作频繁执行)
答案 0 :(得分:2)
这类似于Subversion将其存储库存储在磁盘上的方式。存储库中的每个修订都存储为文件,存储库使用每1000个修订的文件夹。这似乎表现得相当不错,除了文件很可能变得支离破碎或彼此远离。 Subversion允许您将每个1000个修订文件夹打包到一个文件中(但这很有效,因为一旦创建修订版就不会修改。
如果您打算经常修改这些文档,可以考虑使用嵌入式数据库为您管理实体文件(Firebird是一个没有任何大小限制的好文件)。这样您就不必自己管理文件的增长和组织(当您开始修改实体文件中的文件时,这会变得复杂)。如果您使用单独的服务/流程来管理数据库并与之通信,这也将有助于解决并发访问(读/写)问题。即使使用嵌入式服务器,新版本的Firebird(2.5)也支持对数据库的多个进程访问。这样,您可以对文件存储进行多次访问,而无需运行数据库服务器。
答案 1 :(得分:2)
您应该做的第一件事是分析您的应用。特别是你想得到磁盘队列长度的计数器。队列长度shouldn't be any more than 1.5 to 2乘以您拥有的磁盘轴数。
例如,如果您有一个磁盘系统,那么队列长度不应超过2.如果您有一个包含3个磁盘的RAID阵列,则应该超过6个。
确认您确实是写入绑定的。如果是这样,那么加速执行大量写入的最佳方法是购买具有非常快的写入性能的磁盘。请注意,大多数RAID设置都会导致性能下降。
如果写入性能至关重要,那么跨多个驱动器分散存储可能会起作用。当然,对于需要阅读该信息的任何应用程序,您必须考虑到这一点。你仍然需要购买快速驱动器。
请注意,并非所有驱动器都是相同的,有些驱动器比其他驱动器更适合高性能。
答案 2 :(得分:0)
如何使用ThreadPool呢?
即。对于每个接收到的“文件”,将一个写入函数排入线程池线程,该线程实际上将数据持久保存到磁盘上的文件中。