【发布时间】:2009-05-21 12:07:34
【问题描述】:
在对我正在为 Windows Mobile 编写的类库进行一些最终测试时 (使用 Compact Net Framework 2.0),我遇到了 OOM 异常。
基本上,我的库首先加载一个字典文件(一个带有单词列表的普通文本文件),然后加载另一个基于字典的文件(我称之为 KeyMap),其大小与之前加载的字典大致相同.
在我尝试加载大小约为 2.7MB 的西班牙语词典之前,上述文件一切正常(使用模拟器和我的真实设备)。到目前为止,我使用的其他语言词典没有任何 OOM 异常,每个词典大约有 1.8MB。使用西班牙语词典,我可以毫无问题地加载第一个文件,但是当我尝试读取第二个文件时,我得到了 OOM 错误。
下面我已经编写了我正在使用的代码。基本上我读取文件并将其内容分配给字符串变量(DictData 和 TextKeyMap)。然后我对字符串变量进行拆分以将内容传递给字符串数组(Dict 和 KeyMap)。
'Loading Dictionary works
Dim ReadDictionary As StreamReader = New StreamReader(DictPath, Encoding.UTF8)
DictData = ReadDictionary.ReadToEnd()
ReadDictionary.Close()
Dict = DictData.ToString.ToUpper.Split(mySplitSep.ToCharArray) 'mySplitSep=chr(10)
DictData = "" 'perhaps "nothing" is better
'Loading KeyMap gives me error
Dim ReadHashKeyMap As StreamReader = New StreamReader(HashKeyMapPath, Encoding.UTF8)
TextKeyMap = ReadHashKeyMap.ReadToEnd() '<-- OOM-error
ReadHashKeyMap.Close()
KeyMap = TextKeyMap.ToString.Split(mySplitSep.ToCharArray) 'mySplitSep=chr(10)
TextKeyMap = "" 'perhaps "nothing" is better
我是一个没有专业知识的业余程序员,所以我上面显示的代码可能是 改善。我没有使用 ReadToEnd,而是尝试读取 For 循环中的每一行,但我得到了 同样的错误(它也很慢)。
我认为该错误是由于 Windows Mobile 中 32MB 的连续内存限制所致。
你们中的任何人都可以帮助我,或许可以提出一些替代解决方案?也许 问题是由于我上面显示的蹩脚代码?怎么样,加载第二个文件 另一个线程?这行得通吗?
我能得到的所有帮助将不胜感激。
编辑:前段时间我问了一个类似的问题(here),但这个问题与处理字节接收更相关,并使用块来解决。在这种情况下,我正在处理字符串。
Edit2:这个库是一个拼写检查库。它工作得很好,并实现了一些相当先进的技术,例如 Soundex 和 DoubleMetaPhone 算法。到目前为止,唯一的主要问题是上面提到的问题,其中包含一个巨大的西班牙语文本文件。其他词典都还行。更多信息请见this link
【问题讨论】:
-
您能给我们举个例子说明文件中的内容吗?
-
或许相关且有用? --> stackoverflow.com/questions/678025/…
-
Eric:这只是一个单词列表:“car”“cars”“cart”等(每个单词单独一行)
-
@moster67 - 那么哈希键映射是一样的吗?我想我想弄清楚这两个文件是如何相关的,以及如何将其压缩为一个文件而不是两个文件。
-
EricP:KeyMap 文件类似于字典的索引文件。你可以称它为 HashKeyMap。 KeyMap 文件是使用 Soundex 算法创建的。虽然单词表的结构是“word” + chr(10) + “word”等,但 KeyMap 文件如下: 代码(由 Soundex 生成):来自单词表的所有单词都具有这种发音(代码)。我已经尝试创建一个读取字典的 HashKeyMap(而不是使用“第二个文件”),但它比较慢,因为它必须被排序和加载)
标签: .net string windows-mobile memory-management compact-framework