ঝাঁকুনির অ্যাপ্লিকেশনটিতে বিচ্ছিন্নতার সাথে মেমরির সমস্যা আছে?


9

ফ্লুটার অ্যাপ্লিকেশনটির সাথে আমার মেমরির বিষয়ে সমস্যা আছে, যখন গণনা ব্যবহার করার সময়, আমি এই লাইনটি ফাংশন প্যারামিটারে গণনাতে রেখেছি:

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;

যতবার আমি এই কল করি, স্মৃতিশক্তি বাড়তে থাকে।


আপনি আরও কোড ভাগ করতে পারেন? বিশেষত গণনা পদ্ধতি।
ইসেন মেহমেট

আমি সম্পাদনায় কোড যুক্ত করেছি, এটি পরীক্ষা করে দেখুন। আমাকে উত্তর দেওয়ার জন্য ধন্যবাদ। @ এসেনমেহমেট
হোয়াংকুই

গণনা পদ্ধতি কী? Imglib কি? আপনি কি দয়া করে আরও বিশদ যুক্ত করতে পারেন?
ইগোর খারখর্ডিন

আপনি এখানে গণনা পদ্ধতিটি পড়তে পারেন: api.flutter.dev/flutter/foundation/compute.html , এটি আমার বাস্তবায়ন কার্য নয়, আমি কেবল এটি ব্যবহার করি। imglib হ'ল প্যাকেজ চিত্র: pub.dev/packages/image । দুঃখিত আমার খারাপ @ ইগরখারখর্ডিন
hoangquyy

1
আমি মনে করি যে ব্যবহারের পরে var imageপ্রথম সারির প্রথমটি getCropImage(...)প্রকাশিত হয় না, তাই var imageক্ষেত্র হিসাবে চেষ্টা করুন (সর্বদা নতুন মেমরি বরাদ্দ না করার জন্য), সম্ভবত প্রতিটি লুপ পদক্ষেপে একটি নতুন ভেরি ইনস্ট্যান্ট না করার জন্য দরকারী হতে পারে! সর্বদা এই ধরণের অবজেক্টগুলিকে পুনরায় ব্যবহার করার চেষ্টা করুন, বিশেষত যখন আপনি বড় আকারের চিত্রগুলি যেমন চিত্রের সাথে পরিচালনা করছেন। সাধারণত আবর্জনা সংগ্রহকারী সমস্ত অব্যবহৃত পদার্থ মুক্ত করার গ্যারান্টি দেয় না। এবং মনে রাখবেন, কখনও কল করবেন না System.gc() বা অনুরূপ পদ্ধতিগুলি সরাসরি (মেমোরি অবলম্বনের জন্য বাধ্য করার জন্য), এটি ভাঙা এবং অপ্টিমাইজড কোডের লক্ষণ। :)
রবার্তো মানফ্রেদা

উত্তর:


0

আপনার নমুনা দিয়ে পুনরুত্পাদন করার চেষ্টা করতে, আমাকে একটি ইউআই থেকে রূপান্তর করতে হয়েছিল I প্রথমে চিত্র:

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


সুতরাং আমি মনে করি সমস্যাটি আমার কোড থেকে আসে নি। আমি এই সমস্যাটি সমাধানের জন্য অন্য উপায় ব্যবহার করেছি তবে আর বিচ্ছিন্নভাবে ব্যবহার করছি না। তবে, এই মেমরি সমস্যাটি সমাধান করা ভাল, আপনাকে ধন্যবাদ।
হোয়াংকিউই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.