4

我正在构建“应用程序虚拟化”产品。我使用XML文件作为虚拟注册表。 从我的软件生成的虚拟应用程序访问虚拟注册表Xml。 它运行,但运行速度非常慢。XML作为虚拟注册表使应用程序运行缓慢

我在每个Registry API调用中加载和卸载XML,因为来自父级的多个进程都访问同一个注册表文件。这可能会导致应用程序运行缓慢。

任何一个可以让我知道XML的替代...

+3

为什么要在每个注册表API调用中加载它?平均应用程序可能会向注册表提供数十亿次呼叫;这种方法会非常缓慢。为什么不在启动时加载一次,然后用读写器锁同步访问呢? – Luke 2011-02-12 13:06:11

+0

最初我在内存中加载一次,访问它,写入它并关闭应用程序,然后保存到辅助内存。许多应用程序创建多个进程并尝试同时访问注册表。一旦涉及到多个进程,加载到第一个进程的主内存中的注册表就会超出范围,并且不会与其他进程同步。我们需要在这些流程之间建立一个共同的记忆。 – 2011-02-12 13:26:09

+1

如果我要这样做,我会使用一个真正的(嵌入式?)数据库... XML不是为了速度。 – 2011-02-12 14:20:34

回答

0

其文本树转换时间。 我在Loadaing的代码中管理了这个,并且在所有进程中解析了XML之后,才在任何一个进程中发生了写操作。

0

如果你把它加载到内存中,并从那里对它进行操作,然后你的问题不是XML。 剖析你的应用程序,找出它花费的大部分时间。 我想你可能会发现它花费大部分时间来搜索你想要访问的项目。

1

您可以改用数据库。它会更快。 Sqlite是轻量级和强大的。

0

嗯,你当然可以一直使用真实的注册表,这是线程安全的,快速...

否则,你必须创建一个用于管理虚拟XML注册一个独立的进程,保持内存中的XML结构,所以它不必一直读/写。然后,需要访问它的进程可以使用IPC与注册表进程进行通信。

另一种想法是,如果多个进程不可能一直更新注册表:将虚拟XML注册表保存在内存中,并在更改时将其写入磁盘,但通过后台线程异步执行。访问注册表时,首先检查文件是否已更改;如果没有,你不需要重新加载它。