क्या स्पंदन ऐप में आइसोलेट के साथ मेमोरी इश्यू है?


9

मुझे स्पंदन ऐप के साथ मेमोरी के बारे में समस्या है, जब कम्प्यूट का उपयोग करते हैं, तो मैं इस लाइन को कंपाउंड में फ़ंक्शन पैरामीटर में रखता हूं:

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;

हर बार मैं यह कहता हूं, स्मृति बढ़ती रहती है।


क्या आप अधिक कोड साझा कर सकते हैं? विशेषकर गणना विधि।
एसेन मेहमत

मैंने एडिट में कोड जोड़ा है, इसे देखें। मुझे जवाब देने के लिए धन्यवाद। @EsenMehmet
hoangquyy

गणना विधि क्या है? इमलीज क्या है? क्या आप कृपया, अधिक विवरण जोड़ सकते हैं?
इगोर खारखोर्डिन

आप यहाँ कंप्यूट विधि पढ़ सकते हैं: api.flutter.dev/flutter/foundation/compute.html , यह मेरा कार्यान्वयन कार्य नहीं है, मैं इसका उपयोग करता हूँ। imglib पैकेज है छवि: pub.dev/packages/image । माफ़ कीजियेगा मेरे बुरे @IgorKharakhordin
hoangquyy

1
मुझे लगता है कि उपयोग के बाद रिलीज var imageकी पहली पंक्ति में getCropImage(...)नहीं है, इसलिए var imageफ़ील्ड के रूप में उपयोग करने का प्रयास करें (हमेशा नई मेमोरी को आवंटित नहीं करने के लिए), शायद हर लूप कदम पर एक नया संस्करण तुरंत नहीं करने के लिए उपयोगी हो सकता है! हमेशा इस प्रकार की वस्तुओं का पुन: उपयोग करने का प्रयास करें, खासकर जब आप छवियों जैसे बड़ी वस्तुओं के साथ काम कर रहे हों। आम तौर पर कचरा संग्रहकर्ता सभी अप्रयुक्त वस्तुओं को मुक्त करने की गारंटी नहीं देता है। और याद रखें, कभी भी System.gc() या इसी तरह के तरीकों को सीधे (मेमोरी डीलोकेशन को मजबूर करने के लिए) कॉल न करें , यह टूटे हुए और अनुकूलित कोड का लक्षण नहीं है। :)
राबर्टो मैनफ्रेडा

जवाबों:


0

अपने नमूने के साथ पुन: पेश करने की कोशिश करने के लिए, मुझे पहले ui.Image से बदलना पड़ा:

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

अपने नमूने का एक सरलीकृत संस्करण चलाएं:

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

लेकिन मैं स्मृति को नियंत्रण से बाहर जाते हुए नहीं देख पा रहा था। तो आपके पास शायद कुछ और चल रहा है।


क्या आपने प्रोफ़ाइल मोड में मेमोरी की जाँच की है? कौन सा संस्करण स्पंदन का आप उपयोग कर रहे हैं? मुझे यकीन नहीं है लेकिन शायद यह स्पंदन संस्करण से आया है। किसी को मेरी जैसी ही समस्या है: - stackoverflow.com/questions/57826962/…
hoangquyy


इसलिए मुझे लगता है कि समस्या मेरे कोड से नहीं आई है। मैंने इस समस्या को हल करने के लिए अन्य तरीके का उपयोग किया है, लेकिन अब अलग नहीं किया है। हालाँकि, यह स्मृति समस्या को हल करने के लिए अच्छा है, धन्यवाद।
होंगक्वी

0

हमारे जैसे एक स्टार्टर के लिए, हमें यह समझने की आवश्यकता है कि गणना कार्य कुछ और नहीं बल्कि खुद को अलग करना है। और जितना अधिक आप कॉल करने के लिए और अधिक मेमोरी को अलग करने की आवश्यकता होगी, जिसकी आपको आवश्यकता होगी। यह सन्दर्भ आइसोलेट्स स्पॉन ~ 2mb का रैम लेगा और इसलिए हमें जितना संभव हो सके उतना कम आइसोलेट्स बनाने की आवश्यकता है, हालांकि आप कह सकते हैं कि मैं सिर्फ कंप्यूटिंग कर रहा हूं और रिजल्ट इतना अलग हो सकता है कि आपको जीसी कॉल मिल सकती है, लेकिन एक समय में आप स्क्रॉल नहीं कर सकते हैं और कैशिंग या अलग-थलग या आपके कोड को उस आइसोलेट के भीतर कुछ करने से मेमोरी इनप्रिंट में भारी असर पड़ सकता है।

ऐसा करने के बजाय मैं आपको सुझाव देता हूं कि आप एक आइसोलेट बनाएं और जो भी सामान करना चाहते हैं उसे करें और जब आप सभी को पूरा कर लें तो आप चेहरे को अलग कर दें।

आइसोलेट का उपयोग कैसे करें, यह जानने के लिए यह वीडियो भी देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.