【发布时间】:2014-08-16 18:39:06
【问题描述】:
我的一个需求是管理共享资源(更像是一个日志,具有读写操作)
在应用程序中的不同进程(因此也是多个线程)之间。数据也应该是
坚持系统重启,因此它应该是一个物理文件/数据库。
共享资源是一些具有键、值信息的数据。 (因此可以使用此共享资源完成的可能操作是添加新的键值信息,
更新/删除现有的键值信息)。
因此我正在考虑使用 xml 文件来物理存储信息,示例内容将
看起来像,
<Root>
<Key1>Value</Key1>
<Key2>Value</Key2>
<Key3>Value</Key3>
</Root>
进行读取和操作的界面如下所示,
public interface IDataHandler
{
IDictionary<string,string> GetData();
void SetData(string key,string value);
}
我可以假设数据不会超过 500 MB,因此 xml 决定以及数据是否增长 我会将其移至数据库。 此外,与读取操作相比,写入数据会更多。
与上述场景相关的查询/设计考虑很少,
这样可以处理 xml 文件中的 500 MB 数据吗?
假设文件为 xml ,现在如何处理性能考虑?
- 我正在考虑将数据缓存(.Net 中的MemoryCache 类)为 Dictionary ,这将启用
为了达到读操作时的性能,是否可以在内存中缓存 500 MB 的数据,或者我们是否可以
还有其他选择吗?
现在,如果我使用上面的缓存机制,写操作过程中会发生什么:
我是否应该在每次写入操作期间通过转换
将字典内容再次写入 xml
整个字典到 xml ?要么 - 有什么方法可以只更新 xml 文件中数据被修改/添加的部分?或任何
处理这种情况的其他方法? - 我是否应该通过将写入操作放入队列和后台来再次提高性能
线程读取队列并启用实际写入操作,以便实际写入数据的人
不会因为写入文件而受到影响吗? - 处理多线程场景,打算用全局名的Mutex,有没有其他的
更好的方法?
我确定,我的操作几乎没有假设,并尝试从那里构建,如果我错了
某些假设会改变大部分设计概念。因此,全新的解决方案也是
欢迎(以绩效为主要标准)。 提前致谢。
【问题讨论】:
-
这一切听起来都非常复杂且容易出错。为什么不使用数据库?数据库解决诸如持久性、一致性、崩溃一致性、备份、高可用性等问题。
-
我会保留它作为一个选项,而不是直接考虑数据库,我还想了解其他选项的优缺点,因此从 xml/text 文件开始。如果您觉得这种基于文件的方法容易出错,请您多解释一下如何解释,至少正如我所料,这对我来说是一个新的学习。
-
@usr: 忘了提一下,开始时 xml 大小不会超过 1MB 左右,但随着时间的推移会像几年后一样小幅增长。我不想在初始阶段本身投资 DB 解决方案,但必须保持我的设计开放以在未来支持它。你仍然认为我在做/假设有什么问题吗?
-
好吧,我提到的所有问题你都得有答案。这需要时间并且容易出错。例如,如果您在编写新的数据库版本时进程死机(错误、蓝屏、断电)怎么办?现在你有一半的数据库。其余的都没了。你可以安全地完成这项工作,但为什么要承担这个负担呢?您还谈到了线程和排队。你正在进入那里的危险领域。作为一个学习项目,这是可以的,但对于商业项目,这是错误的解决方案。选择一种易于施工且安全的。
-
使用XML文件有什么特殊原因吗?
标签: c# multithreading performance optimization file-io