Выполняя последние тесты библиотеки классов, которую я пишу для Windows Mobile
(используя Compact Net Framework 2.0), я столкнулся с OOM-исключением.
По сути, моя библиотека загружает сначала файл словаря (обычный текстовый файл со списком слов), а затем другой файл, основанный на словаре (я называю это KeyMap), размер которого примерно равен размеру ранее загруженного словаря. ,
Все работало нормально (с помощью эмулятора и моего реального устройства) с указанными выше файлами, пока я не попытался загрузить испанский-словарь, размер которого составляет примерно 2,7 МБ. Другие языковые словари, которые я использовал до сих пор без каких-либо OOM-исключений, составляют примерно 1,8 МБ каждый. С помощью испанского словаря я могу загрузить первый файл без проблем, но когда я пытаюсь прочитать второй файл, я получаю ошибку OOM.
Ниже я написал код, который я использую. В основном я читаю файлы и присваиваю их содержимое строковой переменной (DictData и TextKeyMap). Затем я делю Split на строковую переменную для передачи содержимого в строковый массив (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, но я получил
та же самая ошибка (это было также медленнее).
Я предполагаю, что ошибка связана с ограничением 32 МБ непрерывной памяти в Windows Mobile.
Кто-нибудь из вас может мне помочь, возможно, предложив несколько альтернативных решений? Может быть
проблема из-за моего дерьмового кода, показанного выше? Как насчет загрузки второго файла в
другая нить? Может ли это работать?
Любая помощь, которую я могу получить, будет высоко оценена.
Редактировать : Я задал похожий вопрос некоторое время назад ( здесь ), но этот вопрос был больше связан с приемом байтов и был решен с использованием кусков. В этом случае я имею дело со строками.
Edit2 : Эта библиотека является библиотекой проверки орфографии. Он работает довольно хорошо и реализует некоторые довольно продвинутые методы, такие как Soundex- и DoubleMetaPhone-алгоритмы. Пока единственной серьезной проблемой является упомянутая выше проблема с огромным текстовым файлом для испанского языка. Другие словари в порядке. Для получения дополнительной информации, пожалуйста, смотрите эту ссылку