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.
var image
di baris pertamagetCropImage(...)
tidak dirilis setelah penggunaan, jadi coba gunakanvar image
sebagai 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 panggilSystem.gc()
atau metode serupa langsung (untuk memaksa deallokasi memori), itu gejala kode rusak dan tidak dioptimalkan. :)Jawaban:
Untuk mencoba mereproduksi dengan sampel Anda, saya harus mengonversi dari ui. Gambar pertama:
Jalankan versi sampel Anda yang disederhanakan:
Tetapi saya tidak dapat melihat ingatannya menjadi tidak terkendali. Jadi Anda mungkin memiliki hal lain yang terjadi.
sumber
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
sumber