Earth Engine-এ আপনার তৈরি করা অ্যালগরিদম Google Cloud-এ রান করে, যা অনেক কম্পিউটারে ডিস্ট্রিবিউট করা থাকে। ডিবাগিং করা চ্যালেঞ্জিং হতে পারে কারণ ক্লায়েন্ট-সাইড কোড অথবা কোড করা নির্দেশের সার্ভার-সাইড এক্সিকিউশনে সমস্যা হতে পারে এবং স্কেলিং সংক্রান্ত সমস্যা এবং সিনট্যাক্টিক বা লজিক্যাল সমস্যার কারণেও হতে পারে। প্রোগ্রামের যে অংশ ক্লাউডে চলছে তা আপনি না চাইলে পরিদর্শন করার জন্য উপলভ্য নয়। এই ডকুমেন্টটি ডিবাগিং কৌশল, টুল এবং সমাধান উপস্থাপন করে যা আপনাকে সাধারণ ত্রুটিগুলি সমাধান করতে এবং Earth Engine স্ক্রিপ্ট ডিবাগ করতে সাহায্য করে।
সিনট্যাক্স সংক্রান্ত সমস্যা
আপনার কোড প্রোগ্রামিং ল্যাঙ্গুয়েজের (Earth Engine-এ JavaScript বা Python) নিয়ম লঙ্ঘন করলে সিনট্যাক্স সংক্রান্ত সমস্যা হয়। এইসব সমস্যার কারণে আপনার কোড রান করে না এবং সাধারণত এক্সিকিউশনের আগেই ধরা পড়ে। আপনি সিনট্যাক্স সংক্রান্ত কোনও সমস্যার সম্মুখীন হলে, হাইলাইট করা লাইন বা সমস্যার মেসেজটি মনোযোগ সহকারে পর্যালোচনা করুন এবং Python ল্যাঙ্গুয়েজ রেফারেন্স বা Google JavaScript স্টাইল গাইড-এর মতো রিসোর্স দেখুন। এছাড়াও, কোড লিন্টার এইসব সমস্যা শনাক্ত ও সমাধান করতে সাহায্য করতে পারে।
ক্লায়েন্ট-সাইড সংক্রান্ত সমস্যা
সিনট্যাক্সগতভাবে সঠিক কোড থাকা সত্ত্বেও, স্ক্রিপ্টের ধারাবাহিকতা বা লজিক সংক্রান্ত সমস্যা থাকতে পারে। নিচের উদাহরণে দেখানো হয়েছে যে অস্তিত্ব নেই এমন ভেরিয়েবেল ও পদ্ধতি ব্যবহার করলে কী ধরনের সমস্যা হয়।
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
// Load a Sentinel-2 image. var image = ee.Image('NASA/NASADEM_HGT/001'); // Error: "bandNames" is not defined in this scope. var display = image.visualize({bands: bandNames, min: 0, max: 9000}); // Error: image.selfAnalyze is not a function var silly = image.selfAnalyze();
import ee import geemap.core as geemap
Colab (Python)
# Load a Sentinel-2 image. image = ee.Image('NASA/NASADEM_HGT/001') # NameError: name 'band_names' is not defined. display = image.visualize(bands=band_names, min=0, max=9000) # AttributeError: 'Image' object has no attribute 'selfAnalyze'. silly = image.selfAnalyze()
প্রথম সমস্যাটি আপনাকে জানায় যে bandNames ভেরিয়েবেলটি যে স্কোপে রেফার করা হয়েছে
সেখানে সেটি নির্দিষ্ট করা নেই। সমাধান হিসেবে, ভেরিয়েবেল সেট করুন অথবা bands প্যারামিটারের জন্য
তালিকা আর্গুমেন্ট প্রদান করুন। দ্বিতীয় সমস্যাটি দেখায় যে,
অস্তিত্বহীন selfAnalyze() ফাংশন কল করা হলে কী হয়। যেহেতু
এটি ছবিতে কোনও আসল পদ্ধতি নয়, তাই এই সমস্যা আপনাকে জানায় যে এটি কোনও ফাংশন নয়। দুটি ক্ষেত্রেই, সমস্যাটি কী তা বর্ণনা করা থাকে।
অজানা অবজেক্ট টাইপ কাস্টিং
Earth Engine কোনও ভেরিয়েবলের ধরন বুঝতে না পারলে,
"...is not a function" সমস্যা হতে পারে। এই সমস্যার সাধারণ লক্ষণগুলি নিম্নলিখিত কারণে দেখা যায়:
first()-এর মাধ্যমে ফেরত পাঠানো অবজেক্টের উপর কিছু করা (কালেকশনে এলিমেন্টের ধরন অজানা)।get()-এর মাধ্যমে ফেরত পাঠানো অবজেক্টের সাথে কিছু করা (প্রপার্টিতে স্টোর করা এলিমেন্টের ধরন অজানা)।- ফাংশন আর্গুমেন্টের (ফাংশনে) ধরন অজানা থাকলে, আর্গুমেন্টের সাথে কিছু করা।
প্রথমটির উদাহরণ:
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var collection = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Error: collection.first(...).area is not a function var area = collection.first().area();
import ee import geemap.core as geemap
Colab (Python)
collection = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017') # AttributeError: 'Element' object has no attribute 'area'. area = collection.first().area()
সব ক্ষেত্রেই সমাধান হল, অজানা ধরনের অবজেক্টকে পরিচিত ধরনের কনস্ট্রাক্টরের সাথে কাস্ট করা। আগের উদাহরণটি চালিয়ে যেতে, সমাধান হল
ee.Feature-এ কাস্ট করা:
সমাধান — কাস্ট ব্যবহার করুন!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var area = ee.Feature(collection.first()).area();
import ee import geemap.core as geemap
Colab (Python)
area = ee.Feature(collection.first()).area()
(মনে রাখবেন, আপনি এখানে Element-এ যেকোনও পদ্ধতি নিরাপদে কল করতে পারেন
কারণ Earth Engine-এর মতে এটি তাই)।
ক্লায়েন্ট ও সার্ভার ফাংশন একসাথে ব্যবহার করবেন না
নিম্নলিখিত উদাহরণটি ততটা স্পষ্ট নয়:
সমস্যা — এই কোডটি আপনার চাহিদা অনুযায়ী কাজ করে না
কোড এডিটর (জাভাস্ক্রিপ্ট)
// Don't mix EE objects and JavaScript objects. var image = ee.Image('NASA/NASADEM_HGT/001'); var nonsense = image + 2; // You can print this, but it's not what you were hoping for. print(nonsense); // Error: g.eeObject.name is not a function Map.addLayer(nonsense);
import ee import geemap.core as geemap
Colab (Python)
# Don't mix EE objects and Python objects. image = ee.Image('NASA/NASADEM_HGT/001') nonsense = image + 2 # TypeError: unsupported operand type(s) for +: 'Image' and 'int'. display(nonsense) # TypeError: unsupported operand type(s) for +: 'Image' and 'int'. m = geemap.Map() m.add_layer(nonsense) m
ধরা যাক, এই কোডের লেখক ছবির প্রতিটি পিক্সেলে 2 যোগ করতে চেয়েছেন,
এটি করার সঠিক উপায় এটি নয়। বিশেষ করে, এই কোডটি ভুলভাবে একটি সার্ভার-সাইড অবজেক্ট (image)
এবং একটি ক্লায়েন্ট-সাইড অপারেটর (+) একসাথে মিশিয়ে দেয়।
ফলাফলটি আশ্চর্যজনক হতে পারে। প্রথম ক্ষেত্রে, JavaScript কোড এডিটরে
nonsense প্রিন্ট করলে, image এবং 2,
উভয়কেই স্ট্রিংয়ে পরিবর্তন করে,
তারপর তাদের কনক্যাটিনেট করে অনুরোধ করা অপারেশন (+) পারফর্ম করবে। ফলাফল হিসেবে পাওয়া স্ট্রিংটি অনাকাঙ্ক্ষিত (Python-এ TypeError দেখানো হয়)।
দ্বিতীয় ক্ষেত্রে, ম্যাপে nonsense যোগ করার সময়, জাভাস্ক্রিপ্ট কোড এডিটরে
g.eeObject.name is not a function ক্রিপ্টিক সমস্যা দেখানো হয় কারণ ম্যাপে যোগ করা অবজেক্ট, nonsense, হল একটি স্ট্রিং, EE অবজেক্ট নয় (Python-এ TypeError দেখানো হয়)। সম্ভাব্য অনিচ্ছাকৃত ফলাফল এবং
তথ্যহীন ত্রুটি এড়াতে, সার্ভার অবজেক্ট এবং ফাংশনগুলিকে ক্লায়েন্ট অবজেক্ট, প্রিমিটিভ
বা ফাংশনের সাথে মেশাবেন না। এই উদাহরণের সমাধান হল সার্ভার ফাংশন ব্যবহার করা।
সমাধান — সার্ভার ফাংশন ব্যবহার করুন!
কোড এডিটর (জাভাস্ক্রিপ্ট)
Map.addLayer(image.add(2));
import ee import geemap.core as geemap
Colab (Python)
m = geemap.Map() m.add_layer(image.add(2)) m
আরও জানতে ক্লায়েন্ট বনাম সার্ভার পৃষ্ঠা দেখুন।
জাভাস্ক্রিপ্ট কোড এডিটর ব্রাউজার লক
ক্লায়েন্টে চলা জাভাস্ক্রিপ্ট অনেক বেশি সময় নিলে অথবা Earth Engine থেকে কোনও কিছুর জন্য অপেক্ষা করলে, ব্রাউজার ফ্রিজ বা লক হয়ে যেতে পারে। এই সমস্যার দুটি সাধারণ কারণ হল
আপনার JavaScript কোড এডিটর কোডে for-loops এবং/অথবা getInfo(), যার মধ্যে
সবচেয়ে খারাপ পরিস্থিতি হল for-loop-এর মধ্যে getInfo()। For-loops-এর কারণে ব্রাউজার লক হয়ে যেতে পারে, কারণ কোড আপনার মেশিনে রান করে। অন্যদিকে,
getInfo() Earth Engine থেকে কম্পিউটেশনের ফলাফল সিঙ্ক্রোনাসভাবে অনুরোধ করে,
ফলাফল না পাওয়া পর্যন্ত ব্লক করে। গণনা করতে অনেক সময় লাগলে, ব্লক করার ফলে
আপনার ব্রাউজার লক হয়ে যেতে পারে। Code Editor-এ কাজ করার সময় for-loops এবং getInfo()
উভয়ই এড়িয়ে চলুন। আরও জানতে
ক্লায়েন্ট বনাম সার্ভার পৃষ্ঠা
দেখুন।
সার্ভার-সাইড সমস্যা
ক্লায়েন্ট কোডে লজিক্যাল ধারাবাহিকতা থাকা সত্ত্বেও, কিছু বাগ থাকতে পারে যা শুধুমাত্র সার্ভারে রান টাইমে স্পষ্ট হয়ে ওঠে। নিচের উদাহরণে দেখানো হয়েছে যে অস্তিত্ব নেই এমন ব্যান্ড পাওয়ার চেষ্টা করলে কী হয়।
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
// Load a Sentinel-2 image. var s2image = ee.Image( 'COPERNICUS/S2_HARMONIZED/20160625T100617_20160625T170310_T33UVR'); // Error: Image.select: Pattern 'nonBand' did not match any bands. print(s2image.select(['nonBand']));
import ee import geemap.core as geemap
Colab (Python)
# Load a Sentinel-2 image. s2image = ee.Image( 'COPERNICUS/S2_HARMONIZED/20160625T100617_20160625T170310_T33UVR' ) # EEException: Image.select: Band pattern 'non_band' did not match any bands. print(s2image.select(['non_band']).getInfo())
এই উদাহরণে, সমস্যাটি আপনাকে জানায় যে nonBand নামে কোনও ব্যান্ড নেই। সম্ভবত স্পষ্ট সমাধান হল এমন একটি ব্যান্ডের নাম উল্লেখ করা যা
আছে। আপনি ছবি প্রিন্ট করে এবং কনসোলে এটি পরীক্ষা করে অথবা image.bandNames()-এর মাধ্যমে ফেরত পাঠানো ব্যান্ড নামের তালিকা প্রিন্ট করে ব্যান্ড নামগুলি আবিষ্কার করতে পারেন।
অপরিবর্তনীয়তা
Earth Engine-এ আপনার তৈরি করা সার্ভার-সাইড অবজেক্ট
পরিবর্তন করা যায় না। (যেকোনও
ee.Object হল সার্ভার সাইড Object)। এর অর্থ হল, আপনি
অবজেক্টে কোনও পরিবর্তন করতে চাইলে, আপনাকে পরিবর্তিত অবস্থাটি একটি নতুন
ভেরিয়েবলে সেভ করতে হবে। যেমন, Sentinel-2 ছবিতে প্রপার্টি সেট করার জন্য এটি কাজ করবে না:
সমস্যা — এই কোডটি আপনার চাহিদা পূরণ করতে পারবে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var s2image = ee.Image( 'COPERNICUS/S2_HARMONIZED/20160625T100617_20160625T170310_T33UVR'); s2image.set('myProperty', 'This image is not assigned to a variable'); // This will not result in an error, but will not find 'myProperty'. print(s2image.get('myProperty')); // null
import ee import geemap.core as geemap
Colab (Python)
s2image = ee.Image( 'COPERNICUS/S2_HARMONIZED/20160625T100617_20160625T170310_T33UVR' ) s2image.set('my_property', 'This image is not assigned to a variable') # This will not result in an error, but will not find 'my_property'. display(s2image.get('my_property')) # None
এই উদাহরণে, s2image.set() নতুন প্রপার্টি সহ ছবির একটি কপি রিটার্ন করে, কিন্তু s2image ভেরিয়েবলে স্টোর করা ছবি অপরিবর্তিত থাকে। s2image.set()-এর মাধ্যমে
ফেরত পাঠানো ছবি আপনাকে নতুন ভেরিয়েবলে সেভ করতে হবে। যেমন:
সমাধান — ভেরিয়েবেলে ফলাফল ক্যাপচার করুন!
কোড এডিটর (জাভাস্ক্রিপ্ট)
s2image = s2image.set('myProperty', 'OK'); print(s2image.get('myProperty')); // OK
import ee import geemap.core as geemap
Colab (Python)
s2image = s2image.set('my_property', 'OK') display(s2image.get('my_property')) # OK
ম্যাপ করা ফাংশন
অন্য একটি প্রসঙ্গ যেখানে ক্লায়েন্ট এবং সার্ভার ফাংশনগুলি মিশ্রিত হয় না তা হল ম্যাপ করা
ফাংশন। বিশেষ করে, ম্যাপ করা ফাংশন দ্বারা নির্দিষ্ট করা অপারেশন ক্লাউডে চলে,
তাই getInfo এবং Export-এর মতো ক্লায়েন্ট ফাংশন
(পাশাপাশি print এবং JavaScript কোড এডিটরে Map এবং Chart-এর
পদ্ধতি) ম্যাপ করা ফাংশনে কাজ করবে না। যেমন:
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var collection = ee.ImageCollection('MODIS/061/MOD44B'); // Error: A mapped function's arguments cannot be used in client-side operations var badMap3 = collection.map(function(image) { print(image); return image; });
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('MODIS/061/MOD44B') # Error: A mapped function's arguments cannot be used in client-side operations. bad_map_3 = collection.map(lambda image: print(image.getInfo()))
এই কিছুটা রহস্যময় সমস্যার কারণ হল Earth Engine-এর এই কোডকে Google সার্ভারে রান করার মতো নির্দেশের সেটে পরিবর্তন করার প্রসেস। ম্যাপ করা ফাংশনে পাস করা আর্গুমেন্ট ইমেজে কাজ করার জন্য ক্লায়েন্ট-সাইড ফাংশন এবং কন্ট্রোল স্ট্রাকচার ব্যবহার করা যাবে না। এই সমস্যা এড়াতে, ম্যাপ করা ফাংশনে ক্লায়েন্ট-সাইড ফাংশন ব্যবহার করবেন না। ক্লায়েন্ট ও সার্ভার ফাংশনের মধ্যে পার্থক্য সম্পর্কে আরও জানতে ক্লায়েন্ট বনাম সার্ভার পৃষ্ঠা দেখুন।
ম্যাপ করা ফাংশনের অতিরিক্ত প্রয়োজনীয়তা আছে। যেমন, ম্যাপ করা ফাংশন অবশ্যই কিছু ফেরত পাঠাবে:
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var collection = ee.ImageCollection('MODIS/061/MOD44B'); // Error: User-defined methods must return a value. var badMap1 = collection.map(function(image) { // Do nothing. });
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('MODIS/061/MOD44B') # Error: User-defined methods must return a value. bad_map_1 = collection.map(lambda image: None)
সম্ভবত স্পষ্ট সমাধান হল কিছু ফেরত দেওয়া। তবে এটি যেকোনও ধরনের জিনিস
ফেরত দিতে পারে না। নির্দিষ্টভাবে, ImageCollection বা
FeatureCollection-এর উপর ম্যাপ করা ফাংশন অবশ্যই Image বা
Feature রিটার্ন করবে। যেমন, আপনি ImageCollection-এর উপর ম্যাপ করা ফাংশন থেকে তারিখ
ফেরত দিতে পারবেন না:
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var collection = ee.ImageCollection('MODIS/061/MOD44B'); var badMap2 = collection.map(function(image) { return image.date(); }); // Error: Collection.map: A mapped algorithm must return a Feature or Image. print(badMap2);
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('MODIS/061/MOD44B') bad_map_2 = collection.map(lambda image: image.date()) # EEException: Collection.map: # A mapped algorithm must return a Feature or Image. print(bad_map_2.getInfo())
এটি এড়াতে, নতুন প্রপার্টি সেট সহ ইনপুট ছবি ফিরিয়ে দিন। তারপর, আপনার যদি সংগ্রহের ছবিগুলির তারিখের একটি তালিকা প্রয়োজন হয়, আপনি aggregate_array() ব্যবহার করতে পারেন:
সমাধান — প্রপার্টি সেট করুন!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var collection = ee.ImageCollection('MODIS/061/MOD44B'); var okMap2 = collection.map(function(image) { return image.set('date', image.date()); }); print(okMap2); // Get a list of the dates. var datesList = okMap2.aggregate_array('date'); print(datesList);
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('MODIS/061/MOD44B') ok_map_2 = collection.map(lambda image: image.set('date', image.date())) print(ok_map_2.getInfo()) # Get a list of the dates. dates_list = ok_map_2.aggregate_array('date') print(dates_list.getInfo())
পদ্ধতিগত ত্রুটি
কোনও ব্যান্ড নেই এমন ছবিতে প্যাটার্ন প্রয়োগ করা হয়েছে
"Pattern 'my_band' was applied to an Image with no bands"
সমস্যার অর্থ হল, খালি ব্যান্ড তালিকা সহ
ছবির জন্য ee.Image.select() কল করা হয়েছে। এই সমস্যা সমাধান করতে আপনি যা করতে পারেন:
- ছবিটি যদি রিডিউসার সহ ImageCollection থেকে বা
first()বাtoBands()কল ব্যবহার করে তৈরি করা হয়, তাহলে নিশ্চিত করুন সোর্স কালেকশন খালি নেই। ee.Dictionary().toImage()ব্যবহার করে ডিকশনারি থেকে ছবি তৈরি করা হলে, নিশ্চিত করুন যে ডিকশনারিটি খালি নেই।- ছবিটি স্ট্যান্ডঅ্যালোন হলে, এতে ডেটা আছে কিনা তা নিশ্চিত করুন (এবং শুধু
ee.Image(0)নয়)।
স্কেলিং সংক্রান্ত সমস্যা
কোনও স্ক্রিপ্ট সিনট্যাক্সের দিক থেকে সঠিক, লজিক্যাল ভুল ছাড়া এবং সার্ভারের জন্য সঠিক নির্দেশাবলীর সেট হলেও, সমান্তরালভাবে গণনা করা এবং তা কার্যকর করার সময়, ফলাফল হিসেবে পাওয়া অবজেক্ট খুব বড়, খুব বেশি বা গণনা করতে অনেক বেশি সময় লাগতে পারে। এই ক্ষেত্রে, আপনি একটি সমস্যার মেসেজ পাবেন যা ইঙ্গিত করে যে অ্যালগরিদম স্কেল করা যাবে না। এই ধরনের সমস্যা সাধারণত সবচেয়ে কঠিন হয় এবং এর সমাধান করাও সহজ নয়। এই ধরনের সমস্যার উদাহরণ হল:
- কম্পিউটেশনের টাইম-আউট হয়ে গেছে
- একসাথে অনেক বেশি অ্যাগ্রিগেশন করা হচ্ছে
- ব্যবহারকারীর মেমরির সীমা পেরিয়ে গেছে
- একটি ইন্টার্নাল সমস্যা হয়েছে
আপনার কোডের স্কেলিং উন্নত করলে আপনি আরও দ্রুত ফলাফল পাবেন এবং সমস্ত ব্যবহারকারীর জন্য কম্পিউটিং রিসোর্সের
উপলভ্যতাও উন্নত হবে। প্রতিটি ধরনের সমস্যা সম্পর্কে নিম্নলিখিত বিভাগে আলোচনা করা হয়েছে,
reduceRegion() সম্পর্কে সংক্ষিপ্ত আলোচনার পরে, এটি সাধারণত ব্যবহৃত
ফাংশন যা সব ধরনের স্কেলিং সমস্যা তৈরি করার জন্য কুখ্যাত।
reduceRegion()
যদিও reduceRegion() লোভীর মতো যথেষ্ট পিক্সেল ব্যবহার করে যাতে
উত্তেজনাপূর্ণ বিভিন্ন ধরনের ত্রুটি ট্রিগার করা যায়, এছাড়াও কম্পিউটেশন নিয়ন্ত্রণ করার জন্য প্যারামিটার আছে, যাতে আপনি ত্রুটিগুলি কাটিয়ে উঠতে পারেন। যেমন, নিম্নলিখিত
অনুপযুক্ত কমানোর বিষয়টি বিবেচনা করুন:
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var absurdComputation = ee.Image(1).reduceRegion({ reducer: 'count', geometry: ee.Geometry.Rectangle([-180, -90, 180, 90], null, false), scale: 100, }); // Error: Image.reduceRegion: Too many pixels in the region. // Found 80300348117, but only 10000000 allowed. print(absurdComputation);
import ee import geemap.core as geemap
Colab (Python)
absurd_computation = ee.Image(1).reduceRegion( reducer='count', geometry=ee.Geometry.Rectangle([-180, -90, 180, 90], None, False), scale=100, ) # EEException: Image.reduceRegion: Too many pixels in the region. # Found 80300348117, but only 10000000 allowed. print(absurd_computation.getInfo())
এই বোকা বোকা উদাহরণটি শুধু দেখানোর জন্য। এই সমস্যার উদ্দেশ্য হল আপনাকে জিজ্ঞাসা করা যে আপনি সত্যিই ৮০৩০০৩৪৮১১৭ (অর্থাৎ ৮০ বিলিয়ন) পিক্সেল কমাতে চান কিনা। যদি না হয়, তাহলে সেই অনুযায়ী scale (মিটারে পিক্সেল সাইজ) বাড়ান অথবা
bestEffort-কে 'সত্য' হিসেবে সেট করুন, যাতে অটোমেটিক আরও বড় স্কেল আবার গণনা করা যায়। এইসব প্যারামিটার সম্পর্কে আরও জানতে
reduceRegion() পৃষ্ঠা
দেখুন।
কম্পিউটেশনের টাইম-আউট হয়ে গেছে
ধরা যাক, আপনার কম্পিউটেশনে এই সব পিক্সেল প্রয়োজন। সেক্ষেত্রে, আপনি
maxPixels প্যারামিটার বাড়াতে পারেন যাতে গণনা সফলভাবে করা যায়। তবে, Earth Engine-এর
গণনা সম্পূর্ণ করতে কিছুটা সময় লাগবে। এর ফলে,
"কম্পিউটেশন টাইম আউট" সংক্রান্ত সমস্যা দেখা দিতে পারে:
খারাপ — এটি করবেন না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var ridiculousComputation = ee.Image(1).reduceRegion({ reducer: 'count', geometry: ee.Geometry.Rectangle([-180, -90, 180, 90], null, false), scale: 100, maxPixels: 1e11 }); // Error: Computation timed out. print(ridiculousComputation);
import ee import geemap.core as geemap
Colab (Python)
ridiculous_computation = ee.Image(1).reduceRegion( reducer='count', geometry=ee.Geometry.Rectangle([-180, -90, 180, 90], None, False), scale=100, maxPixels=int(1e11), ) # Error: Computation timed out. print(ridiculous_computation.getInfo())
এই সমস্যার অর্থ হল, Earth Engine গণনা বন্ধ করার আগে প্রায় পাঁচ মিনিট অপেক্ষা করেছে। এক্সপোর্ট করার মাধ্যমে Earth Engine-কে এমন পরিবেশে গণনা করার অনুমতি দেওয়া হয়
যেখানে আরও বেশি সময় ধরে রান করা যায় (তবে আরও বেশি মেমরি নয়)। reduceRegion() থেকে রিটার্ন ভ্যালু
একটি ডিকশনারি হওয়ায়, আপনি ফাঁকা জ্যামিতি সহ কোনও ফিচারের প্রপার্টি সেট করতে
ডিকশনারি ব্যবহার করতে পারবেন:
ভালো — Export ব্যবহার করুন!
কোড এডিটর (জাভাস্ক্রিপ্ট)
Export.table.toDrive({ collection: ee.FeatureCollection([ ee.Feature(null, ridiculousComputation) ]), description: 'ridiculousComputation', fileFormat: 'CSV' });
import ee import geemap.core as geemap
Colab (Python)
task = ee.batch.Export.table.toDrive( collection=ee.FeatureCollection([ee.Feature(None, ridiculous_computation)]), description='ridiculous_computation', fileFormat='CSV', ) # task.start()
একসাথে অনেক বেশি অ্যাগ্রিগেশন করা হচ্ছে
এই সমস্যার "অ্যাগ্রিগেশন" অংশটি এমন অপারেশনকে বোঝায় যা একাধিক মেশিনে ছড়িয়ে থাকে (যেমন, একাধিক টাইল জুড়ে থাকা রিডাকশন)। Earth Engine-এ এই ধরনের অনেক অ্যাগ্রিগেশন একসাথে রান করা আটকানোর জন্য সীমা নির্ধারণ করা আছে। এই উদাহরণে, "একসাথে অনেক বেশি অ্যাগ্রিগেশন" সমস্যাটি ম্যাপের মধ্যে কমানোর কারণে ট্রিগার হয়েছে:
খারাপ — এটি করবেন না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var collection = ee.ImageCollection('LANDSAT/LT05/C02/T1') .filterBounds(ee.Geometry.Point([-123, 43])); var terribleAggregations = collection.map(function(image) { return image.set(image.reduceRegion({ reducer: 'mean', geometry: image.geometry(), scale: 30, maxPixels: 1e9 })); }); // Error: Quota exceeded: Too many concurrent aggregations. print(terribleAggregations);
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('LANDSAT/LT05/C02/T1').filterBounds( ee.Geometry.Point([-123, 43]) ) def apply_mean_aggregation(image): return image.set( image.reduceRegion( reducer='mean', geometry=image.geometry(), scale=30, maxPixels=int(1e9), ) ) terrible_aggregations = collection.map(apply_mean_aggregation) # EEException: Computation timed out. print(terrible_aggregations.getInfo())
এই কোডের উদ্দেশ্য প্রতিটি ছবির জন্য ছবির পরিসংখ্যান পাওয়া, এই অনুমান করে, একটি
সম্ভাব্য সমাধান হল ফলাফল Export করা। যেমন, ImageCollection-ও যে FeatureCollection,
এই তথ্য ব্যবহার করে,
ছবির সাথে যুক্ত মেটাডেটা টেবিল হিসেবে এক্সপোর্ট করা যেতে পারে:
ভালো — Export ব্যবহার করুন!
কোড এডিটর (জাভাস্ক্রিপ্ট)
Export.table.toDrive({ collection: terribleAggregations, description: 'terribleAggregations', fileFormat: 'CSV' });
import ee import geemap.core as geemap
Colab (Python)
task = ee.batch.Export.table.toDrive( collection=terrible_aggregations, description='terrible_aggregations', fileFormat='CSV', ) # task.start()
ব্যবহারকারীর মেমরির সীমা পেরিয়ে গেছে
Earth Engine-এ আপনার অ্যালগরিদমকে সমান্তরাল করার একটি উপায় হল ইনপুটগুলিকে টাইলসে বিভক্ত করা, প্রতিটি টাইলসে আলাদাভাবে একই গণনা চালানো, তারপর ফলাফলগুলিকে একত্রিত করা। এর ফলে, আউটপুট টাইল গণনা করার জন্য প্রয়োজনীয় সব ইনপুট মেমরিতে ফিট করতে হবে। যেমন, ইনপুট যদি অনেক ব্যান্ড সহ একটি ছবি হয়, তাহলে গণনায় সব ব্যান্ড ব্যবহার করা হলে তা অনেক মেমরি নিতে পারে। দেখানোর জন্য, এই উদাহরণটি একটি টাইল-এ জোর করে (অপ্রয়োজনীয়ভাবে) সম্পূর্ণ ছবি সংগ্রহ করে অনেক বেশি মেমরি ব্যবহার করে:
খারাপ — এটি করবেন না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7']; var memoryHog = ee.ImageCollection('LANDSAT/LT05/C02/T1').select(bands) .toArray() .arrayReduce(ee.Reducer.mean(), [0]) .arrayProject([1]) .arrayFlatten([bands]) .reduceRegion({ reducer: 'mean', geometry: ee.Geometry.Point([-122.27, 37.87]).buffer(1000), scale: 1, bestEffort: true, }); // Error: User memory limit exceeded. print(memoryHog);
import ee import geemap.core as geemap
Colab (Python)
bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'] memory_hog = ( ee.ImageCollection('LANDSAT/LT05/C02/T1') .select(bands) .toArray() .arrayReduce(ee.Reducer.mean(), [0]) .arrayProject([1]) .arrayFlatten([bands]) .reduceRegion( reducer=ee.Reducer.mean(), geometry=ee.Geometry.Point([-122.27, 37.87]).buffer(1000), scale=1, bestEffort=True, ) ) # EEException: User memory limit exceeded. print(memory_hog.getInfo())
এই অত্যন্ত খারাপ কোডটি দেখায় যে সত্যিই প্রয়োজন না হলে অ্যারে ব্যবহার না করার একটি কারণ ('অপ্রয়োজনীয়ভাবে টাইপ কনভার্ট করা এড়িয়ে চলুন' বিভাগটিও দেখুন)। সেই কালেকশনকে বিশাল অ্যারেতে কনভার্ট করা হলে, অ্যারেটি একবারে মেমরিতে লোড করতে হয়। এটি দীর্ঘ সময় ধরে তোলা ছবির সিরিজ হওয়ার কারণে, অ্যারেটি বড় এবং মেমরিতে ফিট হবে না।
একটি সম্ভাব্য সমাধান হল tileScale প্যারামিটারকে আরও বেশি ভ্যালুতে
সেট করা। tileScale-এর ভ্যালু বেশি হলে, টাইলগুলি tileScale^2-এর ফ্যাক্টর দ্বারা ছোট হয়। যেমন, নিম্নলিখিতটি কম্পিউটেশনকে
সফল হতে দেয়:
কোড এডিটর (জাভাস্ক্রিপ্ট)
var bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7']; var smallerHog = ee.ImageCollection('LANDSAT/LT05/C02/T1').select(bands) .toArray() .arrayReduce(ee.Reducer.mean(), [0]) .arrayProject([1]) .arrayFlatten([bands]) .reduceRegion({ reducer: 'mean', geometry: ee.Geometry.Point([-122.27, 37.87]).buffer(1000), scale: 1, bestEffort: true, tileScale: 16 }); print(smallerHog);
import ee import geemap.core as geemap
Colab (Python)
bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'] smaller_hog = ( ee.ImageCollection('LANDSAT/LT05/C02/T1') .select(bands) .toArray() .arrayReduce(ee.Reducer.mean(), [0]) .arrayProject([1]) .arrayFlatten([bands]) .reduceRegion( reducer=ee.Reducer.mean(), geometry=ee.Geometry.Point([-122.27, 37.87]).buffer(1000), scale=1, bestEffort=True, tileScale=16, ) ) print(smaller_hog.getInfo())
তবে, সবচেয়ে ভালো সমাধান হল, অপ্রয়োজনে অ্যারে ব্যবহার না করা, যাতে আপনাকে tileScale নিয়ে
কোনও সমস্যাতেই না পড়তে হয়:
ভালো — Array এড়িয়ে চলুন!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7']; var okMemory = ee.ImageCollection('LANDSAT/LT05/C02/T1').select(bands) .mean() .reduceRegion({ reducer: 'mean', geometry: ee.Geometry.Point([-122.27, 37.87]).buffer(1000), scale: 1, bestEffort: true, }); print(okMemory);
import ee import geemap.core as geemap
Colab (Python)
bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'] ok_memory = ( ee.ImageCollection('LANDSAT/LT05/C02/T1') .select(bands) .mean() .reduceRegion( reducer=ee.Reducer.mean(), geometry=ee.Geometry.Point([-122.27, 37.87]).buffer(1000), scale=1, bestEffort=True, ) ) print(ok_memory.getInfo())
মেমরি সংক্রান্ত সমস্যার সমাধান করার প্রয়োজন না হলে, আপনার tileScale সেট করা উচিত নয়
কারণ ছোট টাইলসের ফলে আরও বেশি প্যারালাইজেশন ওভারহেড হয়।
ইন্টার্নাল সমস্যা
আপনি এই ধরনের কোনও সমস্যার সম্মুখীন হতে পারেন:
আপনি এই সমস্যার সম্মুখীন হলে, JavaScript কোড এডিটর কনসোলে দেখানো "সমস্যার রিপোর্ট করুন" লিঙ্কে ক্লিক করুন। এছাড়াও, আপনি সহায়তা বোতাম থেকে মতামত পাঠাতে পারবেন। আপনার স্ক্রিপ্টে লজিক্যাল ত্রুটির কারণে এই সমস্যা হতে পারে যা শুধুমাত্র রানটাইমে বা Earth Engine-এর অভ্যন্তরীণ কাজ করার ক্ষেত্রে সমস্যা হলে স্পষ্ট হয়। দুই ক্ষেত্রেই, সমস্যাটি সম্পর্কে কোনও তথ্য পাওয়া যায় না এবং এটি সমাধান করার জন্য অভিযোগ জানানো উচিত।
ইন্টার্নাল সমস্যার মধ্যে request আইডি অন্তর্ভুক্ত থাকে, যেমন:
এই স্ট্রিংগুলি অনন্য শনাক্তকারী হিসেবে কাজ করে যা Earth Engine টিমকে নির্দিষ্ট সমস্যা শনাক্ত করতে সাহায্য করে। সমস্যার রিপোর্টে এই স্ট্রিং অন্তর্ভুক্ত করুন।
ডিবাগিং পদ্ধতি
আপনি নিজের বিশ্লেষণের জন্য কোড লিখে, সেটি রান করে একটি সমস্যা পেয়েছেন। এখন কী? এই বিভাগে সমস্যা আলাদা করে চিহ্নিত করা এবং তা সমাধান করার জন্য সাধারণ ডিবাগিং কৌশল বর্ণনা করা হয়েছে।
ভেরিয়েবল ও ম্যাপ লেয়ার পরীক্ষা করা
ধরুন, আপনার কাছে একটি খুব জটিল বিশ্লেষণ আছে যা একটি ত্রুটি তৈরি করে। সমস্যাটি কোথা থেকে শুরু হয়েছে তা যদি স্পষ্ট না হয়, তাহলে প্রাথমিক কৌশল হিসেবে ইন্টারমিডিয়েট অবজেক্ট প্রিন্ট বা ভিজ্যুয়ালাইজ করে সেগুলি পরীক্ষা করে দেখুন যাতে অবজেক্টের স্ট্রাকচার আপনার স্ক্রিপ্টের লজিকের সাথে সামঞ্জস্যপূর্ণ হয়। বিশেষ করে, আপনি Code Editor বা geemap ইন্সপেক্টর টুলের সাহায্যে ম্যাপে যোগ করা লেয়ারের পিক্সেল ভ্যালু ইন্সপেক্ট করতে পারবেন। আপনি কিছু প্রিন্ট করলে, জিপির (▶) সাহায্যে এর প্রপার্টি বড় করে দেখতে ভুলবেন না। কিছু জিনিস চেক করতে হবে, যার মধ্যে রয়েছে:
- ব্যান্ডের নাম। ছবির ব্যান্ড নাম কি আপনার কোডের সাথে মেলে?
- পিক্সেল ভ্যালু। আপনার ডেটার রেঞ্জ কি সঠিক? এটি কি সঠিকভাবে মাস্ক করা হয়েছে?
- ফাঁকা। এমন কিছু কি ফাঁকা আছে যা ফাঁকা থাকার কথা নয়?
- সাইজ। সাইজ কি শূন্য, যখন এটি শূন্য হওয়া উচিত নয়?
aside()
বিশ্লেষণের প্রতিটি মধ্যবর্তী ধাপকে একটি ভেরিয়েবলে রাখা কষ্টকর হতে পারে যাতে
এটি প্রিন্ট এবং পরিদর্শন করা যায়। ফাংশন কলের দীর্ঘ চেইন থেকে মধ্যবর্তী ভ্যালু প্রিন্ট করতে, আপনি aside() পদ্ধতি ব্যবহার করতে পারেন। যেমন:
কোড এডিটর (জাভাস্ক্রিপ্ট)
var image = ee.Image(ee.ImageCollection('COPERNICUS/S2_HARMONIZED') .filterBounds(ee.Geometry.Point([-12.29, 168.83])) .aside(print) .filterDate('2011-01-01', '2016-12-31') .first());
import ee import geemap.core as geemap
Colab (Python)
image = ee.Image( ee.ImageCollection('COPERNICUS/S2_HARMONIZED') .filterBounds(ee.Geometry.Point([-12.29, 168.83])) .aside(display) .filterDate('2011-01-01', '2016-12-31') .first() )
মনে রাখবেন, aside(print) (জাভাস্ক্রিপ্ট কোড এডিটর) এবং
aside(display) (Python geemap) ক্লায়েন্ট সাইড ফাংশন কল করছে এবং এটি
এখনও ম্যাপ করা ফাংশনে কাজ করবে না। এছাড়াও, আপনি ব্যবহারকারীর দ্বারা নির্ধারিত ফাংশনের সাথে
aside ব্যবহার করতে পারেন। যেমন:
কোড এডিটর (জাভাস্ক্রিপ্ট)
var composite = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') .filterBounds(ee.Geometry.Point([106.91, 47.91])) .map(function(image) { return image.addBands(image.normalizedDifference(['B5', 'B4'])); }) .aside(Map.addLayer, {bands: ['B4', 'B3', 'B2'], max: 0.3}, 'collection') .qualityMosaic('nd'); Map.setCenter(106.91, 47.91, 11); Map.addLayer(composite, {bands: ['B4', 'B3', 'B2'], max: 0.3}, 'composite');
import ee import geemap.core as geemap
Colab (Python)
m = geemap.Map() m.set_center(106.91, 47.91, 11) composite = ( ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') .filterBounds(ee.Geometry.Point([106.91, 47.91])) .map(lambda image: image.addBands(image.normalizedDifference(['B5', 'B4']))) .aside(m.add_layer, {'bands': ['B4', 'B3', 'B2'], 'max': 0.3}, 'collection') .qualityMosaic('nd') ) m.add_layer(composite, {'bands': ['B4', 'B3', 'B2'], 'max': 0.3}, 'composite') m
first()-এ ফাংশন রান করা হচ্ছে
উপলভ্য থাকলে, ডিবাগ করার জন্য প্রিন্ট করা এবং ভিজ্যুয়ালাইজ করা উপযোগী, তবে আপনি যখন কোনও কালেকশনের উপর ম্যাপ করা ফাংশন ডিবাগ করছেন, তখন আপনি ফাংশনে প্রিন্ট করতে পারবেন না, যেমনটি ম্যাপ করা ফাংশন বিভাগে বর্ণনা করা হয়েছে। এই ক্ষেত্রে, কালেকশনে সমস্যাযুক্ত এলিমেন্ট আলাদা করা এবং কোনও একটি এলিমেন্টে ম্যাপ করা ফাংশন পরীক্ষা করা উপযোগী। ম্যাপিং না করে ফাংশন পরীক্ষা করার সময়, সমস্যা বুঝতে আপনি প্রিন্ট স্টেটমেন্ট ব্যবহার করতে পারেন। নিচের উদাহরণটি দেখুন।
সমস্যা — এই কোড কাজ করছে না!
কোড এডিটর (জাভাস্ক্রিপ্ট)
var image = ee.Image( 'COPERNICUS/S2_HARMONIZED/20150821T111616_20160314T094808_T30UWU'); var someFeatures = ee.FeatureCollection([ ee.Feature(ee.Geometry.Point([-2.02, 48.43])), ee.Feature(ee.Geometry.Point([-2.80, 48.37])), ee.Feature(ee.Geometry.Point([-1.22, 48.29])), ee.Feature(ee.Geometry.Point([-1.73, 48.65])), ]); var problem = someFeatures.map(function(feature) { var dictionary = image.reduceRegion({ reducer: 'first', geometry: feature.geometry(), scale: 10, }); return feature.set({ result: ee.Number(dictionary.get('B5')) .divide(dictionary.get('B4')) }); }); // Error in map(ID=2): // Number.divide: Parameter 'left' is required. print(problem);
import ee import geemap.core as geemap
Colab (Python)
image = ee.Image( 'COPERNICUS/S2_HARMONIZED/20150821T111616_20160314T094808_T30UWU' ) some_features = ee.FeatureCollection([ ee.Feature(ee.Geometry.Point([-2.02, 48.43])), ee.Feature(ee.Geometry.Point([-2.80, 48.37])), ee.Feature(ee.Geometry.Point([-1.22, 48.29])), ee.Feature(ee.Geometry.Point([-1.73, 48.65])), ]) # Define a function to be mapped over the collection. def function_to_map(feature): dictionary = image.reduceRegion( reducer=ee.Reducer.first(), geometry=feature.geometry(), scale=10 ) return feature.set( {'result': ee.Number(dictionary.get('B5')).divide(dictionary.get('B4'))} ) problem = some_features.map(function_to_map) # EEException: Error in map(ID=2): # Number.divide: Parameter 'left' is required. print(problem.getInfo())
এটি ডিবাগ করতে, সমস্যাটি পরীক্ষা করার জন্য নির্দেশাবলী দেওয়া হয়েছে। তবে, এই সহায়ক ত্রুটি
আপনাকে জানায় যে ID=2-এর সাথে ফিচারে কোনও সমস্যা আছে। আরও
তদন্ত করতে, কোডটি একটু রিফ্যাক্টর করা দরকার। বিশেষ করে, এই বিভাগে যেমন বর্ণনা করা হয়েছে,
কোনও ফাংশন কোনও কালেকশনের উপর ম্যাপ করা থাকলে, আপনি সেই ফাংশনে প্রিন্ট স্টেটমেন্ট
রাখতে পারবেন না। ডিবাগিংয়ের লক্ষ্য হল সমস্যাযুক্ত ফিচারটি আলাদা করা এবং এতে কিছু প্রিন্ট স্টেটমেন্ট সহ
ফাংশনটি চালানো। আগে ব্যবহার করা একই ছবি ও ফিচার
ব্যবহার করে:
কোড এডিটর (জাভাস্ক্রিপ্ট)
// Define a function to be mapped over the collection. var functionToMap = function(feature) { var dictionary = image.reduceRegion({ reducer: 'first', geometry: feature.geometry(), scale: 10, }); // Debug: print(dictionary); return feature.set({ result: ee.Number(dictionary.get('B5')) .divide(dictionary.get('B4')) }); }; // Isolate the feature that's creating problems. var badFeature = ee.Feature(someFeatures .filter(ee.Filter.eq('system:index', '2')) .first()); // Test the function with print statements added. functionToMap(badFeature); // Inspect the bad feature in relation to the image. Map.centerObject(badFeature, 11); Map.addLayer(badFeature, {}, 'bad feature'); Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 3000}, 'image');
import ee import geemap.core as geemap
Colab (Python)
# Define a function to be mapped over the collection. def function_to_map(feature): dictionary = image.reduceRegion( reducer=ee.Reducer.first(), geometry=feature.geometry(), scale=10 ) # Debug: display(dictionary) return feature.set( {'result': ee.Number(dictionary.get('B5')).divide(dictionary.get('B4'))} ) # Isolate the feature that's creating problems. bad_feature = ee.Feature( some_features.filter(ee.Filter.eq('system:index', '2')).first() ) # Test the function with print statements added. function_to_map(bad_feature) # Inspect the bad feature in relation to the image. m = geemap.Map() m.center_object(bad_feature, 11) m.add_layer(bad_feature, {}, 'bad feature') m.add_layer(image, {'bands': ['B4', 'B3', 'B2'], 'max': 3000}, 'image') m
এখন, যেহেতু ফাংশনটি শুধুমাত্র একটি ফিচারে চালানো হয়, তাই আপনি ভিতরে একটি প্রিন্ট (Python geemap-এর জন্য `display`) কল
রাখতে পারেন। প্রিন্ট করা অবজেক্টটি পরীক্ষা করে দেখুন (আহা!) যে reduceRegion()-এর মাধ্যমে
ফেরত পাঠানো অবজেক্টের প্রতিটি ব্যান্ডের জন্য নাল আছে। এর থেকে বোঝা যায় যে কেন
ভাগ করা যাচ্ছে না: কারণ আপনি শূন্যকে শূন্য দিয়ে ভাগ করতে পারবেন না। Why is it null in the first place?
তদন্ত করতে, ম্যাপে ইনপুট ছবি ও খারাপ ফিচার যোগ করুন এবং খারাপ ফিচারের উপর ফোকাস করুন। এটি করার সময় আপনি বুঝতে পারেন যে ছবির সীমানার বাইরে পয়েন্ট থাকার কারণে
সমস্যাটি হচ্ছে। এই আবিষ্কারের ভিত্তিতে, ডিবাগ করা কোড হল:
কোড এডিটর (জাভাস্ক্রিপ্ট)
var functionToMap = function(feature) { var dictionary = image.reduceRegion({ reducer: 'first', geometry: feature.geometry(), scale: 10, }); return feature.set({ result: ee.Number(dictionary.get('B5')) .divide(dictionary.get('B4')) }); }; var noProblem = someFeatures .filterBounds(image.geometry()) .map(functionToMap); print(noProblem);
import ee import geemap.core as geemap
Colab (Python)
def function_to_map(feature): dictionary = image.reduceRegion( reducer=ee.Reducer.first(), geometry=feature.geometry(), scale=10 ) return feature.set( {'result': ee.Number(dictionary.get('B5')).divide(dictionary.get('B4'))} ) no_problem = some_features.filterBounds(image.geometry()).map(function_to_map) display(no_problem)
প্রোফাইলার
প্রোফাইলার EECU-সময় এবং মেমরির ব্যবহার (অ্যালগরিদম এবং অ্যাসেট প্রতি) সম্পর্কে তথ্য প্রদান করে যা এটি চালু থাকাকালীন করা গণনা থেকে পাওয়া যায়। সবচেয়ে বেশি রিসোর্স ইনটেনসিভ অপারেশন সম্পর্কে তথ্যের জন্য প্রোফাইলারের উপরের দিকে এন্ট্রিগুলি দেখুন। দীর্ঘ সময় ধরে চলা বা অদক্ষ স্ক্রিপ্টের ক্ষেত্রে, প্রোফাইলারের উপরের এন্ট্রিগুলি স্ক্রিপ্ট অপ্টিমাইজ করার জন্য কোথায় ফোকাস করতে হবে সেই সম্পর্কে ইঙ্গিত প্রদান করে। গুরুত্বপূর্ণ নোট: প্রোফাইলার নিজেই স্ক্রিপ্টের পারফর্ম্যান্সকে প্রভাবিত করে, তাই আপনার শুধুমাত্র প্রয়োজন হলেই এটি চালানো উচিত।