C'è un problema di memoria con l'app isolare nell'app flutter?


9

Ho un problema con la memoria con l'app Flutter, quando uso il calcolo, inserisco questa riga nel parametro della funzione nel calcolo:

var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);

Ed eseguirlo in loop, la memoria continua a crescere ogni volta che si esaurisce la memoria e l'app si è bloccata.

Se non ho quella linea, la memoria è stabile a 40mb. Quindi penso che nel calcolo, non sia stato ripulito dopo il completamento della funzione di calcolo.

Qualcuno ha lo stesso problema?

Modificare:

Ecco come implemento il calcolo:

image = await compute(getCropImage, [copyFaces, streamImg]);

In 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());
}

Con imglib è il pacchetto Image:

import 'package:image/image.dart' as imglib;

Ogni volta che lo chiamo, la memoria continua a crescere.


Puoi condividere più codice? Soprattutto il metodo di calcolo.
Esen Mehmet,

Ho aggiunto il codice in modifica, dai un'occhiata. Grazie per rispondermi. @EsenMehmet
hoangquyy,

Cos'è il metodo di calcolo? Che cos'è imglib? Puoi, per favore, aggiungere maggiori dettagli?
Igor Kharakhordin,

Puoi leggere il metodo di calcolo qui: api.flutter.dev/flutter/foundation/compute.html , che non è la mia funzione di attrezzo, lo uso e basta. imglib è il pacchetto Immagine: pub.dev/packages/image . Mi dispiace mio cattivo @IgorKharakhordin
hoangquyy

1
Penso che var imagenella prima riga della getCropImage(...)non sia rilascio dopo l'uso, quindi prova a usare var imagecome campo (per non allocare sempre nuova memoria), forse può essere utile per non creare un'istanza di una nuova var ad ogni passo del ciclo! Cerca sempre di riutilizzare questi tipi di oggetti, specialmente quando gestisci oggetti di grandi dimensioni come le immagini. Generalmente il Garbage Collector non garantisce di liberare tutti gli oggetti inutilizzati. E ricorda, mai chiamare System.gc() direttamente o metodi simili (per forzare la deallocazione della memoria), questo è sintomo di codice rotto e non ottimizzato. :)
Roberto Manfreda,

Risposte:


0

Per provare a riprodurre con il tuo campione, ho dovuto convertire da un UI.Immagine prima:

Future<Uint8List> _bytePng(ui.Image image) async {
  ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.rawRgba);
  Uint8List byteList = byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes);
  return byteList;
}

Esegui una versione semplificata del tuo esempio:

imglib.Image image2 = await compute(_getImage, [image1.width, image1.height, byteList]);


Future<imglib.Image> _getImage(List<dynamic> values) async {
  var temp = imglib.Image.fromBytes(values[0], values[1], values[2], format: imglib.Format.bgra);

  var rng = new Random().nextInt(50);
  imglib.Image cropped = imglib.copyCrop(temp, 0, 0, temp.width - rng, temp.height - rng);

  return cropped;
}

Ma non sono riuscito a vedere la memoria andare fuori controllo. Quindi probabilmente hai qualcos'altro in corso.


Hai controllato la memoria in modalità Profilo? Quale versione di flutter stai usando? Non sono sicuro, ma forse è venuto dalla versione flutter. Qualcuno ha lo stesso problema come me: - stackoverflow.com/questions/57826962/...
hoangquyy


Quindi penso che il problema non provenga dal mio codice. Ho usato un altro modo per risolvere questo problema ma non ho più usato isolare. Tuttavia, è bene risolvere questo problema di memoria, grazie.
hoangquyy,

0

Per un principiante come noi, dobbiamo capire che la funzione di calcolo non è altro che l'isolato stesso. e più chiamate per creare isolare più memoria avrete bisogno. Questo riferimento spawn di Isolati richiederà ~ 2 MB di RAM e quindi dobbiamo rendere gli isolati il ​​meno possibile anche se potresti dire che sto solo calcolando e restituendo il risultato in modo che isolato possa ricevere chiamate GC ma no alla volta potresti scorrere e la memorizzazione nella cache o l'esecuzione di qualcosa con isolate o il codice all'interno di quell'isolato possono influire sull'ingombro in memoria enorme.

così piuttosto che suggerisco di creare un isolato e fare qualsiasi cosa tu voglia fare e quando finisci tutto ciò che copi le facce quindi chiudi l'isolato.

guarda questo video anche per sapere come usare isolare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.