שימוש במנוע Lightning

‫Lightning Engine היא סביבת זמן ריצה עם ביצועים גבוהים ל-Apache Spark ב-Managed Service for Apache Spark, שמאיצה עומסי עבודה שדורשים משאבי מחשוב רבים ומפחיתה את עלויות זמן הריצה בלי שצריך לשנות את קוד ה-Spark. הוא מיועד למהנדסי מערכות מידע ולמומחי ניתוח נתונים שמריצים עומסי עבודה עתירי מחשוב, שמשתמשים בממשקי API של Spark DataFrame, בממשקי API של Spark Dataset או בשאילתות SQL של Spark.

יתרונות

היתרונות של Lightning Engine כוללים:

  • פעולות נתונים מואצות: שיפור משמעותי בביצועים וחיסכון בעלויות באמצעות אופטימיזציה של האינטראקציה עם Cloud Storage, כולל טיפול במטא-נתונים, עומסי עבודה של כתיבה וקלט/פלט וקטורי.

  • הרצת שאילתות חכמה: שיפורים מתקדמים בכלי האופטימיזציה שמפחיתים באופן דינמי את כמות הנתונים שנסרקים, משפרים את עיבוד הנתונים ויוצרים תוכניות הרצה יעילות יותר, כדי שהשאילתות יהיו מהירות וחסכוניות יותר.

  • עומסי עבודה יעילים של AI ו-ML: הפחתת זמני ההפעלה של אשכולות לעומסי עבודה מבוססי-GPU, ופישוט הפריסה בסביבות מאובטחות באמצעות קובצי אימג' שעברו אופטימיזציה ל-AI.

למרות ש-Lightning Engine משפר את הביצועים באופן משמעותי, ההשפעה הספציפית משתנה בהתאם לעומס העבודה.

השוואה למנוע רגיל

‫Lightning Engine הוא חלופה למנוע הרגיל שמשמש להרצת משימות Spark באשכול של Managed Service for Apache Spark. בטבלה הבאה מוצגת השוואה בין Lightning Engine לבין מנוע רגיל, לפי מאפייני ההפעלה, התאמה לעומסי עבודה והיתרונות העיקריים.

תכונה מנוע רגיל Lightning Engine
דגל CLI --engine=default או לבטל את ההגדרה של הדגל --engine=lightning
מתאים במיוחד עבור משימות, פיתוח ובדיקות למטרות כלליות עומסי עבודה בקנה מידה ארגוני שדורשים האצה משמעותית
יתרונות עיקריים ביצועים בסיסיים אינטראקציה אופטימלית עם אחסון בענן, הרצת שאילתות חכמה

דרישות לגבי Lightning Engine

הדרישות הבאות חלות על התכונה Lightning Engine:

  • ‫Image version: Lightning Engine must be used with Managed Service for Apache Spark image version 2.3.3 and later 2.3 subminor image version releases, or 3.0.2 and later 3.0 subminor image version releases (debian13 and ubuntu24 images).
  • משימות נתמכות: Spark,‏ PySpark,‏ SparkSQL ו-SparkR. המנוע הרגיל פועל על סוגי עבודה אחרים שנשלחים לאשכול של Lightning Engine.

ביצוע שאילתה מקורית

הפעלת שאילתות מקוריות (NQE) היא רכיב אופציונלי של Lightning Engine, שמספק רמה עמוקה יותר של האצה למשימות ספציפיות. זהו מנוע מקורי שמבוסס על Apache Gluten ו-Velox, שעבר אופטימיזציה לחומרה של Google, ומשפר את הביצועים על ידי הרצת חלקים של שאילתת Spark מחוץ ל-JVM.

מומלץ להשתמש ב-NQE במקרים הבאים:
משימות שדורשות משאבי מחשוב רבים ומשתמשות בממשקי ה-API של Spark DataFrame ושל Spark Dataset, ושאילתות Spark SQL שקוראות נתונים מקבצים ומטבלאות של Parquet,‏ ORC,‏ Apache Iceberg ו-Delta Lake. פורמט קובץ הפלט לא משפיע על הביצועים שלו.
לא מומלץ להשתמש ב-NQE במקרים הבאים:
משימות שמסתמכות במידה רבה על קבוצות עמידות של נתונים מבוזרים (RDD), פונקציות בהגדרת המשתמש (UDF), רוב הספריות של למידת מכונה (ML) ב-Spark ופעולות שקשורות לקלט/פלט עם עיכובים בגלל הגישה לאחסון.

הרצת שאילתות מקוריות ב-ARM

ב-Managed Service for Apache Spark יש תמיכה בהרצת שאילתות מקוריות ב-Lightning Engine בארכיטקטורת ARM, שעברה אופטימיזציה ספציפית למעבדי Google Axion במכונות וירטואליות מסוג C4A ARM (ראו סוגי מכונות ARM שנתמכים ב-Managed Service for Apache Spark) באמצעות קובץ האימג' 2.3-ubuntu22-arm. מכונות Google Axion C4A הן מכונות וירטואליות מבוססות-ARM שמבוססות על ליבות ARM Neoverse V2, ומספקות שיפורים משמעותיים ביחס בין המחיר לביצועים.

הפעלת NQE במכונות Google Axion ARM משלבת בין יחס עלות-תועלת ברמת החומרה ורוחב פס גבוה של זיכרון לכל ליבה, לבין האצה וקטורית מקורית של שאילתות ברמת התוכנה. כך אפשר לצמצם משמעותית את זמני הריצה של השאילתות ואת עלות הבעלות הכוללת (TCO).

היתרונות העיקריים של ARM:

  • מהירות גבוהה פי 2.5 עד 4 בהשוואה ל-Spark בקוד פתוח: שיפור של פי 2.5 עד 4 בביצועים בהשוואה ל-Apache Spark בקוד פתוח בעומסי עבודה של ניתוח נתונים.
  • אופטימיזציה של עלויות: מיקסום היתרון של יחס המחיר-ביצועים במכונות Google Axion C4A (שמספקות יחס מחיר-ביצועים טוב יותר בשיעור של עד 65% בהשוואה למכונות x86 דומות).
  • שוויון מלא בין אופרטורים ופורמטים: שוויון מלא עם אופרטורים של x86 NQE, עם האצה מובנית לפורמטים של טבלאות Cloud Storage Parquet,‏ Apache Iceberg ו-Delta Lake.
  • בלי שינויים בקוד: הפעלה חלקה באשכולות ARM באמצעות דגלי הגדרה רגילים, בלי לשנות את קוד האפליקציה של Spark.

הדרישות להרצת שאילתות מקוריות

הדרישות הבאות חלות על התכונה "הפעלת שאילתות מקוריות":

  • מנוע ביצוע: NQE זמין רק באשכולות שבהם מופעל מנוע Lightning בזמן יצירת האשכול.

  • משימות נתמכות: Spark,‏ PySpark,‏ Spark SQL ו-SparkR. המנוע הרגיל יפעל (ללא NQE) בסוגי עבודה אחרים שנשלחים לאשכול של Lightning Engine.

  • אין מעבדי GPU ומאיצים: משימות עם NQE שמוגשות במאיצי GPU ייכשלו (אבל אפשר להשתמש ב-Lightning Engine בלי NQE).

  • סוגי נתונים: אין תמיכה בקלט מסוגי הנתונים הבאים:

    • ‫Byte: ‏ORC ו-Parquet
    • ‫Struct, ‏ Array, ‏ Map: ‏Parquet

דרישות ארכיטקטורה ומערכת הפעלה

הדרישות של NQE משתנות בהתאם לארכיטקטורת המעבד:

ארכיטקטורה סוגי המכונות הנתמכים מערכת הפעלה ותמונה נתמכות
x86 משפחות מכונות של Intel ו-AMD ‫Debian-12 ו-Ubuntu-22 (גרסת תמונה 2.3.3 וגרסאות 2.3 מאוחרות יותר); Debian-13 ו-Ubuntu-24 (גרסת תמונה 3.0.2 וגרסאות 3.0 מאוחרות יותר)
ARM סדרת המכונות C4A (מכונות וירטואליות של Google Axion ARM) תמונה של 2.3-ubuntu22-arm (גרסה 2.3.3 וגרסאות 2.3 מאוחרות יותר)

תמחור

למידע על מחירים, ראו התמחור של Managed Service for Apache Spark.

יצירת אשכול של Lightning Engine

בקטע הזה מוסבר איך יוצרים אשכול Managed Service for Apache Spark שמפעיל את Lightning Engine במשימות Spark שנשלחות לאשכול.

אפשר גם להפעיל את Native Query Execution‏ (NQE) באשכול כשיוצרים אותו, או להפעיל את NQE מאוחר יותר למשימות Spark ספציפיות שנשלחות לאשכול.

לפני שמתחילים

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that you have the permissions required to complete this guide.

  3. Verify that billing is enabled for your Cloud de Confiance project.

  4. Enable the Dataproc API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  5. Install the Google Cloud CLI.

  6. Configure the gcloud CLI to use your federated identity.

    For more information, see Sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init

התפקידים הנדרשים

כדי ליצור אשכול Managed Service for Apache Spark ולשלוח אליו משימות, נדרשים תפקידים מסוימים של ניהול זהויות והרשאות גישה (IAM). בהתאם למדיניות הארגון, יכול להיות שהבעלים של הפרויקט בענן או האדמין של השירות כבר הקצו את התפקידים האלה לכם או לחשבון שירות. כדי לבדוק את הקצאות התפקידים, קראו את המאמר האם צריך להקצות תפקידים?.

להסבר על מתן תפקידים, קראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

תפקידי משתמשים

כדי לקבל את ההרשאות שדרושות ליצירת אשכול Managed Service for Apache Spark, בקשו מהאדמין להקצות לכם את התפקידים הבאים ב-IAM:

תפקיד של חשבון שירות

כדי לוודא שלחשבון השירות שמשמש כברירת מחדל ב-Compute Engine יש את ההרשאות שנדרשות ליצירת אשכול Managed Service for Apache Spark, צריך לבקש מהאדמין לתת לחשבון השירות שמשמש כברירת מחדל ב-Compute Engine את התפקיד Dataproc Worker ‏ (roles/dataproc.worker) ב-IAM בפרויקט.

יצירת האשכול

בדוגמאות הבאות מוסבר איך ליצור אשכול של Lightning Engine באמצעות מסוף Cloud de Confiance ,‏ Google Cloud CLI,‏ Dataproc API, ספריות הלקוח של Cloud ל-Python או Terraform. אפשר גם ליצור אשכול עם Lightning Engine באמצעות ספריות הלקוח של Cloud ב-Go, ב-Java וב-Node.js.

המסוף

  1. פותחים את הדף Create cluster.
  2. לוחצים על הגדרות נוספות כדי להרחיב את הקטע.
  3. עורכים את ההתאמה האישית והגדרות אחרות.
  4. בחלונית שנפתחת, מוודאים שהתיבה Enable Lightning Engine מסומנת.
  5. אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל למשימות Spark, מסמנים את התיבה Enable Native Execution.
  6. לוחצים על Save.
  7. מגדירים את שאר ההגדרות של האשכול לפי הצורך.
  8. לוחצים על Create cluster.

יצירת אשכול ARM:

כדי ליצור אשכול ARM עם Google Axion והרצת שאילתות מקוריות:

  1. בקטע Worker configuration, בוחרים את סדרת המכונות C4A ואת סוג מכונת ה-ARM.
  2. בקטע תמונה, בוחרים את התמונה של 2.3-ubuntu22-arm.
  3. בקטע Additional configuration > Customization & Other, מוודאים שהאפשרויות Enable Lightning Engine ו-Enable Native Execution מסומנות.
  4. לוחצים על Create cluster.

gcloud

  1. כדי ליצור אשכול עם Lightning Engine, מריצים את הפקודה gcloud dataproc clusters create עם הדגל --engine=lightning. למידע נוסף, קראו את המאמר יצירת אשכול באמצעות ה-CLI של gcloud.

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --engine=lightning \
        --image-version=2.3
    
  2. אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל למשימות Spark, צריך לכלול את המאפיין spark:spark.dataproc.lightningEngine.runtime=native.

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --engine=lightning \
        --image-version=2.3 \
        --properties='spark:spark.dataproc.lightningEngine.runtime=native'
    
  3. יצירת אשכול ARM עם NQE: כדי ליצור אשכול Managed Service for Apache Spark עם צומתי Google Axion C4A ARM ו-NQE מופעל:

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --image-version=2.3-ubuntu22-arm \
        --master-machine-type=c4a-standard-16 \
        --worker-machine-type=c4a-standard-16 \
        --engine=lightning \
        --properties='spark:spark.dataproc.lightningEngine.runtime=native'
    

API

כדי ליצור אשכול עם מנוע Lightning, שולחים בקשת clusters.create. מידע נוסף זמין במאמר יצירת אשכול באמצעות API בארכיטקטורת REST.

  1. בגוף הבקשה, מגדירים את השדה engine לערך LIGHTNING.

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "engine": "LIGHTNING",
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3"
        }
      }
    }
    
  2. אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל לכל המשימות, מוסיפים את המאפיין spark:spark.dataproc.lightningEngine.runtime.

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "engine": "LIGHTNING",
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3",
          "properties": {
            "spark:spark.dataproc.lightningEngine.runtime": "native"
          }
        }
      }
    }
    

Python

  1. כדי ליצור אשכול עם Lightning Engine, משתמשים ב-method‏ create_cluster ומגדירים את השדה engine בהגדרות האשכול כ-LIGHTNING. למידע נוסף, ראו יצירת אשכול באמצעות Python.

    from google.cloud import dataproc_v1
    
    def create_lightning_cluster(project_id, region, cluster_name):
        client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"}
        cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options)
    
        cluster = {
            "project_id": project_id,
            "cluster_name": cluster_name,
            "config": {
                "engine": "LIGHTNING",
                "software_config": {
                    "image_version": "2.3-debian12",
                },
            }
        }
    
        operation = cluster_client.create_cluster(
            project_id=project_id,
            region=region,
            cluster=cluster
        )
        result = operation.result()
        print(f"Cluster created successfully: {result.cluster_name}")
    
  2. אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל למשימות Spark, צריך לכלול את המאפיין spark:spark.dataproc.lightningEngine.runtime.

    from google.cloud import dataproc_v1
    
    def create_lightning_native_cluster(project_id, region, cluster_name):
        client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"}
        cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options)
    
        cluster = {
            "project_id": project_id,
            "cluster_name": cluster_name,
            "config": {
                "engine": "LIGHTNING",
                "software_config": {
                    "image_version": "2.3-debian12",
                    "properties": {
                        "spark:spark.dataproc.lightningEngine.runtime": "native"
                    }
                }
            }
        }
    
        operation = cluster_client.create_cluster(
            project_id=project_id,
            region=region,
            cluster=cluster
        )
        result = operation.result()
        print(f"Cluster created successfully: {result.cluster_name}")
    

Terraform

  1. בהגדרת המשאב google_dataproc_cluster, מגדירים את הארגומנט engine לערך LIGHTNING.
  2. לפרטים נוספים ולאפשרויות מתקדמות, קראו את המאמר הרשמי של Terraform בנושא המשאב google_dataproc_cluster.

אימות מנוע האשכול

המסוף

  1. נכנסים לדף Cluster Details במסוף Cloud de Confiance .
  2. מוודאים שהערך Lightning Engine מופיע בשדה מנוע.
  3. אם הפעלתם את Native Query Execution, ודאו ש-native מופיע בשדה Native Execution.

gcloud

  1. כדי לאמת את המנוע ואת ה-NQE (אם הוא מופעל), מריצים את הפקודה gcloud dataproc clusters describe:

    gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGION
    
  2. בודקים את הפלט של המאפיינים engine ו-lightningEngine.runtime:

    clusterName: lightning-engine-cluster
    engine: lightningEngine
    lightningEngine.runtime: native
    

שליחת משימה באמצעות Lightning Engine

אם הפעלתם את Lightning Engine כשיצרתם אשכול, כשאתם שולחים משימת Spark לאשכול, Lightning Engine מופעל כברירת מחדל במשימה.

הפעלת Native Query Execution במשימה

אם הפעלתם את Native Query Execution‏ (NQE) כשיצרתם אשכול של Lightning Engine, כל משימות Spark יפעלו עם NQE, אלא אם תשביתו את NQE במשימה ספציפית.

אם לא הפעלתם את NQE כשיצרתם את אשכול Lightning Engine, אתם יכולים להפעיל את NQE למשימה כשאתם שולחים אותה, כמו שמוצג בדוגמאות הבאות.

gcloud

כדי להפעיל את Native Query Execution כששולחים משימת Spark, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime=native:

gcloud dataproc jobs submit spark \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=spark.dataproc.lightningEngine.runtime=native \
    -- ...

API

כדי להפעיל את Native Query Execution כששולחים משימת Spark, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime בבקשה:

{
  "job":{
    "placement":{
      "clusterName": ...
    },
    "sparkJob":{
      "mainClass": ...,
      "properties":{
         "spark.dataproc.lightningEngine.runtime":"native"
      }
    }
  }
}

השבתת הרצת שאילתות מקוריות במשימה

אם הפעלתם את Native Query Execution‏ (NQE) כשיצרתם אשכול של Lightning Engine, כל משימות Spark יפעלו כש-NQE מופעל, אלא אם תשביתו את NQE במשימה ספציפית.

אפשר להשבית את NQE למשימת Spark ספציפית כששולחים את המשימה, כמו שמוצג בדוגמאות הבאות.

gcloud

כדי להשבית את Native Query Execution כששולחים משימת Spark לאשכול Lightning Engine, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime=default:

gcloud dataproc jobs submit spark \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=spark.dataproc.lightningEngine.runtime=default \
    -- ...

API

כדי להשבית את Native Query Execution כששולחים משימת Spark לאשכול Lightning Engine, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime=default:

{
  "job":{
    "placement":{
      "clusterName": ...
    },
    "sparkJob":{
      "mainClass": ...,
      "properties":{
         "spark.dataproc.lightningEngine.runtime":"default"
      }
    }
  }
}

אימות של הפעלת שאילתה מקורית במשימה

אחרי ששולחים משימה לאשכול של Lightning Engine, אפשר לוודא שהפעלת השאילתות המקוריות מופעלת במשימה.

המסוף

  1. נכנסים לדף Jobs במסוף Cloud de Confiance .
  2. לוחצים על מזהה המשימה כדי לפתוח את הדף Job details.
  3. מוודאים שהערך native מופיע בשדה Native Execution.

gcloud

  1. מריצים את הפקודה gcloud dataproc jobs describe:

    gcloud dataproc jobs describe JOB_ID --project=PROJECT_ID --region=REGION
    
  2. בודקים את הפלט של lightningEngine.runtime בקטע Properties:

    lightningEngine.runtime: native
    

פרמטרים להגדרה

בטבלה הבאה מפורטים הפרמטרים העיקריים להגדרת Lightning Engine ו-Native Query Execution.

שם הפרמטר תיאור מנועי החיפוש הרלוונטיים ערך ברירת המחדל ערך ברירת המחדל (Lightning Engine) המשתמש יכול לשנות (ברמת המשימה) היקף
--engine הגדרה ברמת האשכול לבחירת המנוע במהלך יצירת האשכול. בכל האשכול default lightning לא אשכול
spark:spark.dataproc.lightningEngine.runtime הגדרה ברמת האשכול לבחירת סביבת זמן הריצה של מנוע Lightning במהלך יצירת האשכול. רק Lightning default default לא אשכול
spark.dataproc.lightningEngine.runtime ההגדרה מפעילה או משביתה את Native Query Execution ‏ (NQE) ב-Lightning Engine. רק Lightning default default כן. אפשר להגדיר את הערך native או default. משימה

מגבלות

הפעלת Native Query Execution בתרחישים הבאים עלולה לגרום לחריגות, לחוסר תאימות ל-Spark או להחזרת עומס העבודה למנוע ברירת המחדל של Spark.

חלופות

הפעלת שאילתות מקוריות בתרחישים הבאים יכולה לגרום לעומס עבודה שחוזר למנוע ההפעלה של Spark:

  • ‫ANSI: אם מצב ANSI מופעל, הביצוע חוזר ל-Spark.
  • מצב תלוי אותיות רישיות: הרצת שאילתות מקוריות תומכת רק במצב ברירת המחדל של Spark, שלא תלוי באותיות רישיות. אם מופעל מצב תלוי אותיות רישיות, יכול להיות שיתקבלו תוצאות שגויות.
  • סריקת טבלה מחולקת למחיצות: הרצת שאילתות מקוריות תומכת בסריקת טבלה מחולקת למחיצות רק כשהנתיב מכיל את פרטי המחיצה. אחרת, עומס העבודה חוזר למנוע הביצוע של Spark.

התנהגות לא תואמת

יכול להיות שתקבלו תוצאות שגויות או שתיתקלו בהתנהגות לא תואמת אם תשתמשו ב-Native Query Execution במקרים הבאים:

  • פונקציות JSON: הרצת שאילתות מקוריות תומכת במחרוזות שמוקפות במירכאות כפולות, ולא במירכאות בודדות. אם משתמשים במירכאות בודדות, התוצאות שגויות. אם משתמשים ב-* בנתיב עם הפונקציה get_json_object, הפונקציה מחזירה את הערך NULL.
  • הגדרת קריאה של Parquet:
    • ב-Native Query Execution, המערכת מתייחסת ל-spark.files.ignoreCorruptFiles כאילו הוא מוגדר לערך ברירת המחדל false, גם כשהוא מוגדר ל-true.
    • התכונה "הרצת שאילתות מקוריות" מתעלמת מ-spark.sql.parquet.datetimeRebaseModeInRead ומחזירה רק את תוכן הקובץ בפורמט Parquet. אין התייחסות להבדלים בין לוח השנה ההיברידי הקודם לבין לוח השנה הגרגוריאני הפרופטי. התוצאות של Spark יכולות להיות שונות.
  • ‫NaN: לא נתמך. יכול להיות שתקבלו תוצאות לא צפויות, למשל אם תשתמשו ב-NaN בהשוואה מספרית.
  • קריאה עמודית של Spark: שגיאה חמורה יכולה להתרחש כי הווקטור העמודי של Spark לא תואם ל-Native Query Execution.
  • זליגה: כשמגדירים מספר גדול של מחיצות ערבוב, התכונה "זליגה לדיסק" יכולה להפעיל OutOfMemoryException. במקרה כזה, הקטנת מספר המחיצות יכולה למנוע את החריגה.

המאמרים הבאים