J'ai un problème de mémoire avec l'application flutter, lorsque j'utilise compute, je mets cette ligne dans le paramètre de fonction dans compute:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
Et exécutez-le en boucle, la mémoire continue de croître à chaque fois, puis la mémoire est insuffisante et l'application s'est bloquée.
Si je n'ai pas cette ligne, la mémoire est stable à 40 Mo. Je pense donc qu'en calcul, il n'a pas été nettoyé après la fin de la fonction de calcul.
Quelqu'un a le même problème?
Éditer:
Voici comment j'implémente le calcul:
image = await compute(getCropImage, [copyFaces, streamImg]);
Dans getCropImage:
Future<imglib.Image> getCropImage(List<dynamic> values) async {
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
double topLeftX = values[0][0].boundingBox.topLeft.dx.round() -
(values[0][0].boundingBox.width * 0.2);
double topLeftY = values[0][0].boundingBox.topLeft.dy.round() -
(values[0][0].boundingBox.height * 0.2);
double width = values[0][0].boundingBox.width.round() +
(values[0][0].boundingBox.width * 0.4);
double height = values[0][0].boundingBox.height.round() +
(values[0][0].boundingBox.height * 0.4);
if (topLeftX <= 0) {
topLeftX = 25;
}
if (topLeftY <= 0) {
topLeftY = 25;
}
if ((topLeftX + width) >= values[1].width) {
width = values[1].width - topLeftX - 25;
}
if ((topLeftY + height) >= values[1].height) {
height = values[1].height - topLeftY - 25;
}
return imglib.copyCrop(
image, topLeftX.round(), topLeftY.round(), width.round(), height.round());
}
Avec imglib est le paquet Image:
import 'package:image/image.dart' as imglib;
Chaque fois que j'appelle cela, la mémoire continue de croître.
var image
première ligne de la getCropImage(...)
n'est pas publiée après l'utilisation, alors essayez d'utiliser var image
comme champ (afin de ne pas allouer toujours de nouvelle mémoire), peut-être peut-être utile de ne pas instancier une nouvelle var à chaque étape de la boucle! Essayez toujours de réutiliser ces types d'objets, surtout lorsque vous gérez avec de gros objets tels que des images. Généralement, le garbage collector ne garantit pas de libérer tous les objets inutilisés. Et rappelez-vous, ne jamais appeler System.gc()
directement ou des méthodes similaires (pour forcer la désallocation de mémoire), c'est le symptôme d'un code cassé et non optimisé. :)