gpt4 book ai didi

.net OutOfMemory 异常

转载 作者:行者123 更新时间:2023-12-01 08:11:30 25 4
gpt4 key购买 nike

在对我为 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),但那个问题与处理字节接收更相关,并使用 block 解决。在这种情况下,我正在处理字符串。

Edit2:这个库是一个拼写检查库。它运行良好,并实现了一些非常先进的技术,例如 Soundex 和 DoubleMetaPhone 算法。到目前为止唯一的主要问题是上面提到的一个巨大的西类牙语文本文件的问题。其他词典都可以。更多信息,请参阅this link

最佳答案

由于您没有说明您使用此文件的目的,我假设您只是出于某种原因搜索一个词。

首先,尝试将完整的文件加载到内存中可能不是一个好主意。相反,在文件中搜索您需要的数据(单词)可能会更有效率,并且也许在内存中保留某种索引信息以加快速度。

由于您要搜索的数据只是一个单词列表,因此扫描文件并记录在单词首字母发生变化的字典中可能是个好主意。例如 A 从第 0 行开始; B 从第 200 行开始; C 从第 300 行等开始。使用这两条信息来填充您的字典;字母是键,行号是值。实际上,字典变成了单词列表文件的高级索引。这本词典也很小。

然后,当你开始查一个词的时候,用这个词的第一个字母去查字典。这将为您提供文件中以该字母开头的单词所在的行号。使用行号(重新)打开文件并通过将流指针移动到目标行直接转到 word 文件中的该行。然后从那里搜索目标词。要么按顺序搜索,一次一行(不推荐它会很慢但会更容易编码)。或者,使用 binary chop 搜索单词(更快,但更难编码)。尽管对于后者,您还需要知道以目标字母开头的单词在文件中的什么位置停止,因为您将搜索文件的一部分。我还建议您在文件中进行单词搜索,而不是将所有这些单词加载到内存中,否则您可能会回到开始时出现 OOM 错误。

如果您有任何不确定的地方,请在此处发表评论,我会尽力解答。

祝你好运

关于.net OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com