【问题标题】:Efficiency of gettext : in-memory translationgettext 的效率:内存翻译
【发布时间】:2012-03-22 10:22:00
【问题描述】:

我有一个带有闪存的嵌入式系统和一个非常低端的 CPU 和更少的 RAM。我想知道使用 .MO 文件进行 gettext 语言翻译的效率如何。

为了获取区域设置语言字符串,每次gettext从闪存中读取MO文件,或者首先将完整的MO二进制文件加载到RAM中,然后从那里获取区域设置字符串?

如果 MO 文件(它会很大 ~1Mb,因为有很多字符串)总是加载到 RAM 中,它会占用我的 RAM。

【问题讨论】:

  • 你描述的系统有操作系统吗?它有文件系统吗?有没有外接Flash。还是带有文件系统的存储卡?
  • 它是开源的,所以你可以随时调整它。
  • @gbulmer ,是的带有文件系统的 Linux。
  • @Lunar Mushrooms - 抱歉,在发布之前我没有收到您的评论。不知道为什么,平时更新真的很不错。

标签: c linux internationalization locale gettext


【解决方案1】:

正如 MSalters 所说,它是开源的,因此您可以对其进行调整。

如果您对系统给出更完整的定义(根据我的评论),我们可能会提供更多帮助。

如果这是一个深度嵌入式系统(我做的那种东西),没有操作系统,也没有任何类型的外部文件系统,字符串必须都在内存中。很可能会有一种机制将这些字符串存储在闪存中,这样它们就不会消耗 RAM。

例如,在 ARM 上,数据结构可以轻松存储在闪存中。为此,您需要告诉编译器将它们存储在程序的哪个部分,使用类似:

const char mesg1[] __attribute__((section (".USER_FLASH"))) 
             = "Ciao a tutti";
const char mesg2[] __attribute__((section (".USER_FLASH"))) 
             = "Riesco a sentire la mia mente va Dave";

程序链接时,需要编写链接脚本将字符串放入Flash中,不会复制到RAM中。

您可以为消息分配大约多少空间?它们占用多少空间?

您可能正在与一个经过充分研究的问题作斗争;随着资源限制的临近,编程工作量呈指数增长。将内容放入最后几%的内存可能需要付出巨大的努力。

曾经“明显”的调整是尝试一些简单的压缩技术。可能会应用于原始消息,并在打印消息时解压缩。

编辑:我认为您的问题看起来如此简单自然,以至于我认为答案很容易找到。

我查看了 gettext 文档,但在那里找不到。我下载了源码。 10 分钟后,老实说,我无法告诉你它是如何工作的。我可以告诉你它比我预期的要复杂得多。我查看了广泛的文档。关于如何最好地组织翻译、如何准备程序以及可能导致问题的事情的大量文档。非常有帮助的见解。然而我找不到任何文档来解释它的整体运行时架构。没有任何。没有。

我最好的建议是访问 GNU gettext 邮件列表,搜索/查看并在必要时询问。邮件列表档案可以在http://savannah.gnu.org/projects/gettext/ 找到。抱歉,我无法提供更多帮助。

【讨论】:

  • 非常感谢,从您的回答中,我得到了如何手动处理的线索。我还将查看 gettext 的源代码以了解如何处理 MO 文件(我猜它们已加载到 RAM 中 - 让我看看)。
  • 只要你在努力,并取得一些进展,人们可能会尝试提供帮助。祝你好运。
  • 啊哈,我在这里有一个链接stackoverflow.com/questions/3437105/… 告诉:“此外,已编译的 gettext 文件 (.mo) 已针对加载到内存中进行了优化,因此它们比纯文本文件更合适(如未编译的 .po 文件)。”
【解决方案2】:

gettext 通常与哈希表一起使用:

  • 当用户选择一种语言时,.mo 文件的内容会被处理以查找每个翻译的偏移量。这些偏移量存储在哈希表中。

  • 当要显示翻译后的字符串时,计算对应英文字符串的哈希值,并使用该哈希值找到翻译后字符串的偏移量。

如果您的嵌入式系统中的 fhash 内存映射到地址空间,则英文字符串和翻译可以存储在闪存中。只有哈希表需要在 RAM 中。您需要为每个翻译的字符串保留一个哈希值和一个指针的大小。如果您使用 CRC32 作为哈希和 4 字节指针,则需要 8kB 的 RAM 来处理 1024 个翻译字符串。

如果您没有将闪存映射到地址空间,则必须在选择语言时将完整的.mo 文件加载到 RAM 中,或者每次您想要调用闪存 IO 例程显示一个字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多