मुझे स्पंदन ऐप के साथ मेमोरी के बारे में समस्या है, जब कम्प्यूट का उपयोग करते हैं, तो मैं इस लाइन को कंपाउंड में फ़ंक्शन पैरामीटर में रखता हूं:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
और इसे लूप में चलाएं, मेमोरी हर बार बढ़ती रहती है फिर मेमोरी से बाहर निकल जाती है और ऐप क्रैश हो जाता है।
अगर मेरे पास वह लाइन नहीं है, तो मेमोरी 40mb पर स्थिर है। इसलिए मुझे लगता है कि कंप्यूट में, यह गणना समारोह खत्म होने के बाद साफ नहीं किया गया है।
किसी को भी एक ही समस्या है?
संपादित करें:
यह है कि मैं गणना कैसे लागू करता हूं:
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 के साथ छवि पैकेज है:
import 'package:image/image.dart' as imglib;
हर बार मैं यह कहता हूं, स्मृति बढ़ती रहती है।
var image
की पहली पंक्ति में getCropImage(...)
नहीं है, इसलिए var image
फ़ील्ड के रूप में उपयोग करने का प्रयास करें (हमेशा नई मेमोरी को आवंटित नहीं करने के लिए), शायद हर लूप कदम पर एक नया संस्करण तुरंत नहीं करने के लिए उपयोगी हो सकता है! हमेशा इस प्रकार की वस्तुओं का पुन: उपयोग करने का प्रयास करें, खासकर जब आप छवियों जैसे बड़ी वस्तुओं के साथ काम कर रहे हों। आम तौर पर कचरा संग्रहकर्ता सभी अप्रयुक्त वस्तुओं को मुक्त करने की गारंटी नहीं देता है। और याद रखें, कभी भी System.gc()
या इसी तरह के तरीकों को सीधे (मेमोरी डीलोकेशन को मजबूर करने के लिए) कॉल न करें , यह टूटे हुए और अनुकूलित कोड का लक्षण नहीं है। :)