У мене проблема з пам’яттю з програванням «flutter», коли під час використання обчислень я ставлю цей рядок у параметр функції в обчисленні:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
І запустіть його в циклі, пам'ять постійно зростає, а потім не має пам’яті, і додаток вийшов з ладу.
Якщо у мене немає цього рядка, пам'ять стабільна на 40 Мб. Тому я думаю, що в обчисленні він не очищається після закінчення функції обчислення.
У когось така ж проблема?
Редагувати:
Ось як я реалізую обчислення:
image = await compute(getCropImage, [copyFaces, streamImg]);
В 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());
}
З imglib є пакет Image:
import 'package:image/image.dart' as imglib;
Щоразу, коли я це називаю, пам'ять постійно зростає.
var image
перший рядок getCropImage(...)
не випуску після використання, тому спробуйте використовувати var image
як поле (для того, щоб не виділяти завжди нову пам'ять), можливо, може бути корисним, щоб не створити новий var на кожному кроці циклу! Завжди намагайтеся повторно використовувати ці типи об’єктів, особливо коли ви керуєте великими об'єктами, такими як зображення. Зазвичай сміттєзбірник не гарантує звільнення всіх невикористаних предметів. І пам’ятайте, що ніколи не дзвоніть System.gc()
або подібні методи безпосередньо (щоб змусити розібратися в пам'яті), це симптом зламаного і неоптимізованого коду. :)