【问题标题】:How to embed a readonly table in dll如何在dll中嵌入只读表
【发布时间】:2011-08-22 18:53:07
【问题描述】:

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

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

附加信息:

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

其中 6 个代码页是单字节代码页,没什么大不了的。 (6 * 256 * 2 = 3072 项)

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

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

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

在当前字典中查找字符非常快。内存使用无关紧要,启动时间最困扰我。

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

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

【问题讨论】:

标签: c# dll embed


【解决方案1】:

将表嵌入到资源文件中无助于内存消耗,因为当访问程序集时,它必须加载到内存中 - 尽管并非总是加载整个文件,但只要你访问资源,它都会被加载。

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

【讨论】:

    【解决方案2】:

    您可以在编译应用程序时使用资源文件来存储数据,并将构建在单个 dll msdn

    【讨论】:

      【解决方案3】:

      希望我没有误解您的需求,但也许您应该考虑使用大数组而不是字典。假设 16 位 unicode 代码点是您需要处理的全部内容(代理对在所有事情上都会造成麻烦),只需创建一个 65,536 字符表。

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

      私有字符[] mymap = 新字符[65536] { ... // 65536 件事情 }

      我相信这应该比将大量数据加载到字典中要快得多。

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

      【讨论】:

      • 感谢您的回复。我还没有尝试过基本数组。我在第一篇文章中提供了更多信息。
      猜你喜欢
      • 1970-01-01
      • 2016-08-22
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2010-10-13
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多