如何在dll中嵌入一个只读表

时间:2011-05-10 20:08:32

标签: c# dll embed

我的dll文件需要一些代码页转换图。有些字符串需要通过char转换为char。目前我创建了几个包含这些地图的巨大词典。这些字典非常庞大,我不得不将它们分成8个字典,否则C#不允许我编译。现在加载应用程序需要几秒钟,而且内存太多。

我希望这会更有效率。也许我可以在我的dll中嵌入一个(或几个)表并用sql或linq或其他东西查询它。现在我知道dll不是用于存储数据,但我的客户会欣赏单个.dll文件。该表只需要readonly并保持~62000行。

其他信息:

我需要将10个代码页转换为unicode并返回。

这些代码页中有6个是单字节代码页,并不是什么大问题。 (6 * 256 * 2 = 3072项)

其中4个是双字节代码页,CP932,CP950,CP936和CP949,使得~62000 * 2 = 124000个项目

我可以省去任何字符集的前128个字符,但这没有多大意义。

如果我可以将其保存在可查询的内容中,我只需要保存~62000 + 1536条记录并使用它们进行双向转换。

查看当前词典中的字符非常快。内存使用情况并不重要,启动时间最让我困扰。

查找必须快速,最糟糕的情况是我必须每秒转换大约20个句子。延迟是不可取的,它必须跟上。

是否有可能以及实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

将表嵌入资源文件对内存消耗没有帮助,因为访问程序集时,必须将其加载到内存中 - 尽管不是总是加载整个文件但是一旦加载你访问资源,它都被加载了。

我想到的最佳解决方案是 Sqlite或Sql Server Compact文件,它与DLL一起发送给客户并包含数据。查询本地db文件将减少内存消耗。

答案 1 :(得分:1)

您可以使用资源文件存储数据,当您编译应用程序时将构建一个单独的dll msdn

答案 2 :(得分:0)

我希望我不会误解你的需求,但也许你应该考虑使用大数组而不是字典。假设您需要处理16位unicode代码点(代理对会抛出一切扳手),只需创建一个65,536个char表。

如果要从char映射到char,这样的表将占用128K,如果需要映射到其他信息,则需要更多。但是,您不会为内部字典数据结构支付开销,并且可以声明性地声明数组:

private char [] mymap = new char [65536] {    ... // 65536件事 }

我认为这比将大量数据加载到词典中要快得多。

同样,如果这不符合您的需求,请提供有关您当前转换方式的更多背景信息,我很乐意编辑或删除。