Apakah ada masalah memori dengan isolate di aplikasi flutter?

9

Saya memiliki masalah tentang memori dengan aplikasi flutter, ketika menggunakan compute, saya menempatkan baris ini dalam parameter fungsi di compute:

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

Dan jalankan dalam lingkaran, memori terus bertambah setiap saat kemudian keluar dari memori dan aplikasi jatuh.

Jika saya tidak memiliki garis itu, memori stabil pada 40MB. Jadi saya pikir dalam penghitungan, itu belum dibersihkan setelah fungsi penghitungan selesai.

Adakah yang memiliki masalah yang sama?

Edit:

Inilah cara saya menerapkan komputasi:

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

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

Dengan imglib adalah paket Gambar:

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

Setiap kali saya menyebut ini, memori terus bertambah.

hoangquyy
sumber
Bisakah Anda membagikan lebih banyak kode? Terutama metode komputasi.
Esen Mehmet
Saya telah menambahkan kode dalam edit, periksa. Terima kasih sudah membalas saya. @EsenMehmet
hoangquyy
Apa itu metode komputasi? Apa itu imglib? Bisakah Anda, tolong, tambahkan lebih detail?
Igor Kharakhordin
Anda dapat membaca metode komputasi di sini: api.flutter.dev/flutter/foundation/compute.html , itu bukan fungsi implement saya, saya hanya menggunakannya. imglib adalah paket Image: pub.dev/packages/image . Maaf @IgorKharakhordin saya yang buruk
hoangquyy
1
Saya berpikir bahwa var imagedi baris pertama getCropImage(...)tidak dirilis setelah penggunaan, jadi coba gunakan var imagesebagai bidang (agar tidak selalu mengalokasikan memori baru), mungkin dapat berguna untuk tidak instantiate var baru di setiap langkah loop! Selalu mencoba untuk menggunakan kembali jenis objek ini, terutama ketika Anda mengelola dengan objek besar seperti gambar. Umumnya pemulung tidak menjamin untuk membebaskan semua benda yang tidak digunakan. Dan ingat, jangan pernah panggil System.gc() atau metode serupa langsung (untuk memaksa deallokasi memori), itu gejala kode rusak dan tidak dioptimalkan. :)
Roberto Manfreda

Jawaban:

0

Untuk mencoba mereproduksi dengan sampel Anda, saya harus mengonversi dari ui. Gambar pertama:

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;
}

Jalankan versi sampel Anda yang disederhanakan:

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;
}

Tetapi saya tidak dapat melihat ingatannya menjadi tidak terkendali. Jadi Anda mungkin memiliki hal lain yang terjadi.

TWL
sumber
Sudahkah Anda memeriksa memori dalam mode Profil? Versi bergetar mana yang Anda gunakan? Saya tidak yakin tapi mungkin itu berasal dari versi bergetar. Seseorang memiliki masalah yang sama dengan saya: - stackoverflow.com/questions/57826962/...
hoangquyy
Jadi saya pikir masalahnya bukan berasal dari kode saya. Saya telah menggunakan cara lain untuk memecahkan masalah ini tetapi tidak menggunakan isolate lagi. Namun, ada baiknya mengatasi masalah memori ini, terima kasih.
hoangquyy
0

Untuk pemula seperti kita, kita perlu memahami bahwa fungsi komputasi tidak lain adalah isolasi itu sendiri. dan semakin banyak Anda menelepon untuk membuat mengisolasi semakin banyak memori yang Anda butuhkan. Referensi ini akan memunculkan Isolate memakan ~ 2mb ram dan jadi kita perlu membuat isolat sesedikit mungkin meskipun Anda mungkin mengatakan bahwa saya hanya menghitung dan mengembalikan hasil sehingga isolat mungkin mendapatkan panggilan GC tetapi tidak pada suatu waktu Anda mungkin menggulir dan caching atau melakukan sesuatu dengan isolat atau kode Anda di dalam isolat itu dapat memengaruhi jejak besar dalam memori.

jadi daripada melakukan itu saya sarankan Anda membuat satu isolat dan melakukan hal apa pun yang ingin Anda lakukan dan ketika Anda menyelesaikan semua Anda menyalin wajah kemudian tutup isolat.

tonton video ini juga untuk mengetahui cara menggunakan isolate

Parth Dave
sumber