ফ্লুটার অ্যাপ্লিকেশনটির সাথে আমার মেমরির বিষয়ে সমস্যা আছে, যখন গণনা ব্যবহার করার সময়, আমি এই লাইনটি ফাংশন প্যারামিটারে গণনাতে রেখেছি:
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]);
গেটক্রপ আইমেজে:
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());
}
ইমগলিব সহ চিত্র প্যাকেজ:
import 'package:image/image.dart' as imglib;
যতবার আমি এই কল করি, স্মৃতিশক্তি বাড়তে থাকে।
var image
প্রথম সারির প্রথমটি getCropImage(...)
প্রকাশিত হয় না, তাই var image
ক্ষেত্র হিসাবে চেষ্টা করুন (সর্বদা নতুন মেমরি বরাদ্দ না করার জন্য), সম্ভবত প্রতিটি লুপ পদক্ষেপে একটি নতুন ভেরি ইনস্ট্যান্ট না করার জন্য দরকারী হতে পারে! সর্বদা এই ধরণের অবজেক্টগুলিকে পুনরায় ব্যবহার করার চেষ্টা করুন, বিশেষত যখন আপনি বড় আকারের চিত্রগুলি যেমন চিত্রের সাথে পরিচালনা করছেন। সাধারণত আবর্জনা সংগ্রহকারী সমস্ত অব্যবহৃত পদার্থ মুক্ত করার গ্যারান্টি দেয় না। এবং মনে রাখবেন, কখনও কল করবেন না System.gc()
বা অনুরূপ পদ্ধতিগুলি সরাসরি (মেমোরি অবলম্বনের জন্য বাধ্য করার জন্য), এটি ভাঙা এবং অপ্টিমাইজড কোডের লক্ষণ। :)