بررسی اجمالی محاسبات

Earth Engine is built on top of Google's tools and services for performing computations at a massive scale. To make it easy to run large geospatial analyses, the Earth Engine platform and API hide much of the complexity of the underlying parallel-processing infrastructure.

واحدهای پردازش سیگنال الکترونیکی (EECU)

نمای کلی

واحد محاسباتی موتور زمین (EECU) مکانیزمی برای نمایش میزان قدرت پردازش آنی است. موتور زمین، کل ردپای محاسباتی وظایف را به عنوان تابعی از میزان استفاده از EECU آنها در طول زمان (EECU-ثانیه، EECU-ساعت و غیره) ردیابی می‌کند. از آنجا که گوگل انواع مختلفی از هسته‌های پردازنده، معماری‌ها و غیره را دارد، EECUها یک مفهوم انتزاعی مفید برای صحبت در مورد قدرت محاسباتی هستند.

انگیزه

کاربران EE اغلب می‌خواهند میزان توان پردازشی مورد نیاز برای گردش کار خود را تخمین بزنند و EECUها معیار ثابتی برای مقایسه ارائه می‌دهند.

مقایسه با معیارهای CPU

تعداد، نوع و معماری ماشین‌هایی که روی یک نتیجه خاص کار می‌کنند می‌تواند با گذشت زمان تغییر کند. از آنجا که هسته‌های فیزیکی مختلف می‌توانند ویژگی‌های عملکردی متفاوتی داشته باشند، Earth Engine تمام پردازش‌ها را با استفاده از EECUها خلاصه می‌کند. یک ساعت EECU (یا هر واحد زمان EECU دیگر) با زمان ساعت دیواری مطابقت ندارد، بنابراین کاری که 10 ساعت EECU مصرف می‌کند، ممکن است زمان اجرای مشاهده شده فقط چند دقیقه داشته باشد.

ثبات و پیش‌بینی‌پذیری

ارسال درخواست‌های یکسان (یا مشابه) به Earth Engine گاهی اوقات می‌تواند منجر به حجم محاسبات بسیار متفاوتی شود. عوامل اصلی این تفاوت‌ها عبارتند از:

  • ذخیره سازی موقت ، مانند استفاده مجدد از نتایج محاسبات قبلی (از جمله نتایج جزئی یا میانی)
  • داده‌های زیربنایی مختلف ، مانند تعداد متغیری از تصاویر ماهواره‌ای، هندسه‌های با پیچیدگی متفاوت و غیره.
  • تغییرات الگوریتم در پلتفرم EE، شامل بهینه‌سازی عملکرد، رفع اشکالات و غیره.
  • تغییرات در کتابخانه‌های کلاینت ، به ویژه اگر به کد یا بسته‌های EE کاربران دیگر وابسته باشید

معیارها

Explore sample Earth Engine computation benchmarks .

معیارهای درخواست‌های ناموفق

Earth Engine doesn't provide performance metrics for failed requests/tasks, since these numbers would be inaccurate or misleading. As an example, if a job fails because a worker task became unresponsive, that worker's processing consumption wouldn't be able to factor into the total.

پروفایلر

The profiler provides information about EECU-time and memory usage (per algorithm and asset) resulting from the computation performed while it's enabled. Each row in the profiler output corresponds to an algorithm, computation, asset load or overhead operation as described in the 'Description' column. The columns in the profiler are:

توضیحات
شرح متنی از محاسبه، الگوریتم، بار دارایی یا عملیات سربار که در حال ترسیم پروفایل است.
تعداد
شاخصی متناسب با تعداد دفعاتی که عملیات شرح داده شده در «توضیحات» فراخوانی شده است.
محاسبه
شاخصی از زمان EECU صرف شده توسط عملیات(ها).
حافظه فعلی

این ستون فقط در صورتی ظاهر می‌شود که خطایی رخ داده باشد، زیرا اسکریپت

حافظه زیادی استفاده شده است. این مقدار حافظه در حال استفاده در هر گره محاسباتی واحد را در لحظه وقوع خطا نشان می‌دهد.

اوج مم

حداکثر حافظه‌ای که در هر گره محاسباتی برای عملیات استفاده می‌شود.

فعال کردن پروفایلر

ویرایشگر کد

همانطور که در راهنمای ویرایشگر کد توضیح داده شده است، از دکمه‌ی «اجرا با پروفایلر» استفاده کنید.

پایتون

برای فعال کردن پروفایلر، کد زیر را در اسکریپت پایتون خود وارد کنید:

with ee.profilePrinting():
   print(ee.Number(3.14).add(0.00159).getInfo())

پروفایل با پایان یافتن context چاپ خواهد شد، چه خطایی در context رخ داده باشد و چه رخ نداده باشد.

برای ثبت پروفایل به صورت رشته، آن را در یک بافر رشته‌ای بنویسید:

import io

out = io.StringIO()
with ee.profilePrinting(destination=out) as p:
    print(ee.Number(3.14).add(0.00159).getInfo())

print('Output:')
print(out.getvalue())

در اینجا پیشنهادی برای تبدیل رشته پروفایل به جدول برای تجزیه و تحلیل آسان‌تر در نوت‌بوک‌های Colab و Jupyter ارائه شده است (توجه داشته باشید که این فقط یک رویکرد است و ممکن است برای همه موارد مناسب نباشد):

import re
import pandas as pd

lines = out.getvalue().split('\n')

column_names = re.split(r'\s{1,}', lines[0])
column_names = [name.strip() for name in column_names if name.strip()]

data = [
    [element for element in re.split(r'\s{2,}', line) if element.strip()]
    for line in lines[1:-1]
]

df = pd.DataFrame(data, columns=column_names)
display(df)