Lors de certains tests finaux d'une bibliothèque de classes que j'écris pour Windows Mobile (à l'aide de Compact Net Framework 2.0), j'ai rencontré une exception de MOO. Fondamentalement, ma bibliothèque charge d'abord un dictionnaire-fichier (un fichier texte ordinaire avec une liste de mots) et ensuite un autre fichier basé sur le dictionnaire (je l'appelle KeyMap) dont la taille est plus ou moins la même que celle précédemment chargée dictionnaire..net Exception OutOfMemory
Tout a bien fonctionné (en utilisant l'émulateur et mon vrai périphérique) avec les fichiers ci-dessus jusqu'à ce que j'essaie de charger un dictionnaire espagnol qui a une taille d'environ 2,7 Mo. Les autres dictionnaires de langue que j'ai utilisés jusqu'ici sans aucune exception de MOO s'élèvent à environ 1,8 Mo chacun. Avec le dictionnaire espagnol, je peux charger le premier fichier sans aucun problème mais quand j'essaye de lire le deuxième fichier, j'obtiens l'erreur OOM.
Ci-dessous j'ai écrit le code que j'utilise. Fondamentalement, je lis les fichiers et affecte son contenu à une variable de chaîne (DictData et TextKeyMap). Ensuite, je fais un Split sur la variable de chaîne pour transmettre le contenu à un tableau de chaînes (Dict et 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
Je suis un passe-temps-programmeur sans connaissance expert donc mon code ci-dessus peut probablement être améliorée. Au lieu d'utiliser ReadToEnd, j'ai essayé de lire chaque ligne dans une boucle For mais j'ai eu la même erreur (c'était aussi plus lent).
Je suppose que l'erreur est due à la limitation de 32 Mo de mémoire contiguë dans Windows Mobile.
N'importe qui parmi vous peut m'aider, peut-être en suggérant des solutions alternatives? Peut-être le problème est dû à mon code de merde montré ci-dessus? Qu'en est-il, en chargeant le deuxième fichier en un autre fil? Cela pourrait-il fonctionner?
Toute l'aide que je peux obtenir sera grandement appréciée.
Modifier: J'ai posé une question similaire il y a quelque temps (here), mais que l'on était plus liée à traiter la réception d'octets et a été résolu en utilisant des morceaux. Dans ce cas, j'ai affaire à des cordes.
Édition2: Cette bibliothèque est une bibliothèque de vérification d'orthographe. Cela fonctionne assez bien et implémente des techniques assez avancées telles que les algorithmes Soundex et DoubleMetaPhone. Le seul problème majeur à ce jour est le problème mentionné ci-dessus avec un énorme fichier texte pour l'espagnol. D'autres dictionnaires sont OK. Pour plus d'informations, veuillez consulter this link
Pouvez-vous nous donner un exemple de ce qu'il y a dans les fichiers? –
peut-être lié et utile? -> http://stackoverflow.com/questions/678025/net-out-of-memory-exceptions-in-windows-mobile-how-to-overcome-this-problem – hometoast
Eric: c'est simplement une liste de mots: " voiture "" voitures "" panier "etc (chaque mot oa une ligne séparée) – moster67