Leistungs- und Datenoptimierung für RPerformance tuning and data optimization for R

Anwendungsbereich:Applies to: JaSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) und höherAnwendungsbereich:Applies to: JaSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) and later

In diesem Artikel werden Leistungsoptimierungen für R- oder Python-Skripts erläutert, die in SQL Server ausgeführt werden.This article discusses performance optimizations for R or Python scripts that run in SQL Server. Mit diesen Methoden können Sie Ihren R-Code aktualisieren, um die Leistung zu steigern und bekannte Probleme zu vermeiden.You can use these methods to update your R code, both to boost performance and to avoid known issues.

Auswählen eines ComputekontextsChoosing a compute context

In SQL Server können Sie beim Ausführen von R-oder Python-Skripts entweder den Computekontext lokal oder SQL verwenden.In SQL Server, you can use either the local or SQL compute context when running R or Python script.

Wenn Sie den lokalen Computekontext verwenden, wird die Analyse auf dem Computer und nicht auf dem Server ausgeführt.When using the local compute context, analysis is performed on your computer and not on the server. Wenn Sie also in Ihrem Code verwendete Daten aus SQL Server abrufen, müssen die Daten über das Netzwerk abgerufen werden.Therefore, if you are getting data from SQL Server to use in your code, the data must be fetched over the network. Die Leistungseinbußen für diesen Netzwerkübertragung hängen von der Größe der übertragenen Daten, dem Geschwindigkeit des Netzwerks und anderen Netzwerkübertragungen ab, die zur gleichen Zeit auftreten.The performance hit incurred for this network transfer depends on the size of the data transferred, speed of the network, and other network transfers occurring at the same time.

Bei Verwendung des SQL Server-Computekontexts wird der Code auf dem Server ausgeführt.When using the SQL Server compute context, the code is executed on the server. Wenn Sie Daten aus SQL Server erhalten, sollten die Daten für den Server, auf dem die Analyse ausgeführt wird, lokal sein, wodurch keine Netzwerkbelastung entsteht.If you are getting data from SQL Server, the data should be local to the server running the analysis, and therefore no network overhead is introduced. Wenn Sie Daten aus anderen Quellen importieren müssen, sollten Sie die Einrichtung von ETL in Betracht ziehen.If you need to import data from other sources, consider arranging ETL beforehand.

Bei der Arbeit mit großen Datenmengen sollten Sie immer den SQL Compute Context verwenden.When working with large data sets, you should always use the SQL compute context.

FaktorenFactors

Die R-Sprache verfügt über das Konzept der Faktoren, bei denen es sich um spezielle Variablen für kategorische Daten handelt.The R language has the concept of factors, which are special variable for categorical data. Datenanalysten verwenden in ihren Formeln häufig Faktorvariablen, da durch die Verwendung von kategorischen Variablen als Faktoren sichergestellt wird, dass die Daten von Machine Learning-Funktionen ordnungsgemäß verarbeitet werden.Data scientists often use factor variables in their formula, because handling categorical variables as factors ensures that the data is processed properly by machine learning functions.

Entwurfsbedingt können Faktorvariablen von Zeichenfolgen in ganze Zahlen umgewandelt und für die Speicherung oder Verarbeitung wieder zurückkonvertiert werden.By design, factor variables can be converted from strings to integers and back again for storage or processing. Die R-Funktion data.frame verarbeitet alle Zeichenfolgen als Faktorvariablen, es sei denn, das Argument stringsAsFactors ist auf false festgelegt.The R data.frame function handles all strings as factor variables, unless the argument stringsAsFactors is set to False. Dies bedeutet, dass Zeichenfolgen für die Verarbeitung automatisch in eine ganze Zahl konvertiert und dann der ursprünglichen Zeichenfolge wieder zugeordnet werden.What this means is that strings are automatically converted to an integer for processing, and then mapped back to the original string.

Wenn die Quelldaten für Faktoren als ganze Zahl gespeichert werden, kann die Leistung beeinträchtigt werden, da R die Faktorganzzahlen zur Laufzeit in Zeichenfolgen konvertiert und dann eine eigene interne Konvertierung von Zeichenfolgen in ganze Zahlen ausführt.If the source data for factors is stored as an integer, performance can suffer, because R converts the factor integers to strings at run time, and then performs its own internal string-to-integer conversion.

Um solche Laufzeitkonvertierungen zu vermeiden, sollten Sie die Werte als ganze Zahlen in der SQL Server-Tabelle speichern und mit dem Argument colInfo die Ebenen für die als Faktor verwendete Spalte angeben.To avoid such run-time conversions, consider storing the values as integers in the SQL Server table, and using the colInfo argument to specify the levels for the column used as factor. Die meisten Datenquellenobjekte in RevoScaleR verwenden den Parameter colInfo.Most data source objects in RevoScaleR take the parameter colInfo. Verwenden Sie diesen Parameter, um die von der Datenquelle verwendeten Variablen zu benennen, ihren Typ anzugeben und die Variablenebenen oder Transformationen für die Spaltenwerte zu definieren.You use this parameter to name the variables used by the data source, specify their type, and define the variables levels or transformations on the column values.

Der folgende R-Funktionsaufruf ruft beispielsweise die Ganzzahlen 1, 2 und 3 aus einer Tabelle ab, ordnet die Werte jedoch einem Faktor mit den Ebenen „Apple“, „Orange“ und „Banane“ zu.For example, the following R function call gets the integers 1, 2, and 3 from a table, but maps the values to a factor with levels "apple", "orange", and "banana".

c("fruit" = c(type = "factor", levels=as.character(c(1:3)), newLevels=c("apple", "orange", "banana")))

Wenn die Quellspalte Zeichenfolgen enthält, ist es immer effizienter, die Ebenen vorab mit dem Parameter colInfo anzugeben.When the source column contains strings, it is always more efficient to specify the levels ahead of time using the colInfo parameter. Der folgende R-Code behandelt beispielsweise die Zeichenfolgen beim Lesen als Faktoren.For example, the following R code treats the strings as factors as they are being read.

c("fruit" = c(type = "factor", levels= c("apple", "orange", "banana")))

Wenn es keinen semantischen Unterschied in der Erstellung der Modelle gibt, kann der letztgenannte Ansatz die Leistung verbessern.If there is no semantic difference in the model generation, then the latter approach can lead to better performance.

DatentransformationenData transformations

Datenanalysten verwenden häufig Transformationsfunktionen, die als Teil der Analyse in R geschrieben werden.Data scientists often use transformation functions written in R as part of the analysis. Die Transformationsfunktion wird auf jede Zeile, die aus der Tabelle abgerufen wird, angewendet.The transformation function is applied to each row retrieved from the table. In SQL Server werden solche Transformationen auf alle in einem Batch abgerufenen Zeilen angewendet, für die eine Kommunikation zwischen dem R-Interpreter und der Analyse-Engine erforderlich ist.In SQL Server, such transformations are applied to all rows retrieved in a batch, which requires communication between the R interpreter and the analytics engine. Zum Ausführen der Umwandlungen werden die Daten von SQL an die Datenanalyse-Engine und dann an den Prozess der R-Interpreter verschoben und zurück.To perform the transformation, the data moves from SQL to the analytics engine and then to the R interpreter process and back.

Aus diesem Grund können Transformationen als Teil des R-Codes eine erhebliche negative Auswirkung auf die Leistung des Algorithmus, abhängig von der Datenmenge, haben.For this reason, using transformations as part of your R code can have a significant adverse effect on the performance of the algorithm, depending on the amount of data involved.

Es ist effizienter, vor der Analyse alle erforderlichen Spalten in der Tabelle oder Ansicht zu haben, um Transformationen während der Berechnung zu vermeiden.It is more efficient to have all necessary columns in the table or view before performing analysis, and avoid transformations during the computation. Wenn es nicht möglich ist, zusätzliche Spalten zu vorhandenen Tabellen hinzuzufügen, können Sie eine andere Tabelle oder Ansicht mit den transformierten Spalten erstellen und eine entsprechende Abfrage zum Abrufen der Daten verwenden.If it is not possible to add additional columns to existing tables, consider creating another table or view with the transformed columns and use an appropriate query to retrieve the data.

Lesen von Zeilen in BatchesBatch row reads

Wenn Sie im Code eine SQL Server-Datenquelle (RxSqlServerData) verwenden, wird empfohlen, den Parameter rowsPerRead zur Angabe der Batchgröße zu verwenden.If you use a SQL Server data source (RxSqlServerData) in your code, we recommend that you try using the parameter rowsPerRead to specify batch size. Dieser Parameter definiert die Anzahl der Zeilen, die abgefragt und dann zur Verarbeitung an das externe Skript gesendet werden.This parameter defines the number of rows that are queried and then sent to the external script for processing. Zur Laufzeit sieht der Algorithmus nur die angegebene Anzahl an Zeilen in jedem Batch.At run time, the algorithm sees only the specified number of rows in each batch.

Die Möglichkeit, die Menge der gleichzeitig zu verarbeitenden Daten zu steuern, kann Ihnen helfen, kann Ihnen bei der Lösung oder Vermeidung von Problemen helfen.The ability to control the amount of data that is processed at a time can help you solve or avoid problems. Wenn das Eingabedataset beispielsweise sehr breit ist (viele Spalten aufweist) oder das Dataset über einige große Spalten (wie freien Text) verfügt, können Sie die Batchgröße verringern, um das Auslagern von Daten aus dem Arbeitsspeicher zu vermeiden.For example, if your input dataset is very wide (has many columns), or if the dataset has a few large columns (such as free text), you can reduce the batch size to avoid paging data out of memory.

Standardmäßig ist der Wert dieses Parameters auf 50000 festgelegt, um eine gute Leistung auch auf Computern mit wenig Arbeitsspeicher zu gewährleisten.By default, the value of this parameter is set to 50000, to ensure decent performance even on machines with low memory. Wenn der Server über genügend Arbeitsspeicher verfügt, kann eine bessere Leistung, insbesondere bei großen Tabellen, durch Erhöhen dieses Wertes auf 500.000 oder selbst auf eine Million erzielt werden.If the server has enough available memory, increasing this value to 500,000 or even a million can yield better performance, especially for large tables.

Die Vorteile der Vergrößerung der Batchgröße werden deutlich bei großen Datasets und in Aufgaben, die in mehreren Prozessen ausgeführt werden können.The benefits of increasing batch size become evident on a large data set, and in a task that can run on multiple processes. Wenn Sie diesen Wert erhöhen, erzielen Sie jedoch nicht immer die besten Ergebnisse.However, increasing this value does not always produce the best results. Es wird empfohlen, dass Sie mit Ihren Daten und dem Algorithmus experimentieren, um den optimalen Wert zu ermitteln.We recommend that you experiment with your data and algorithm to determine the optimal value.

ParallelverarbeitungParallel processing

Um die Leistung von RX-Analysefunktionen zu verbessern, können Sie die Fähigkeit von SQL Server nutzen, Aufgaben parallel mithilfe der verfügbaren Kerne auf dem Servercomputer auszuführen.To improve the performance of rx analytic functions, you can leverage the ability of SQL Server to execute tasks in parallel using available cores on the server computer.

Es gibt zwei Möglichkeiten zum Erreichen der Parallelisierung mit R in SQL Server:There are two ways to achieve parallelization with R in SQL Server:

  • Verwenden Sie @parallel.Use @parallel. Bei Verwendung der sp_execute_external_script gespeicherten Prozedur zur Ausführung eines R-Skripts legen Sie den @parallel-Parameter auf 1 fest.When using the sp_execute_external_script stored procedure to run an R script, set the @parallel parameter to 1. Dies ist die beste Methode, wenn Ihr R-Skript keine RevoScaleR-Funktionen verwendet, die andere Mechanismen für die Verarbeitung aufweisen.This is the best method if your R script does not use RevoScaleR functions, which have other mechanisms for processing. Wenn Ihr Skript RevoScaleR-Funktionen verwendet – die in der Regel mit dem Präfix „RX“ versehen sind–, wird die parallele Verarbeitung automatisch ausgeführt, und Sie müssen @parallel nicht explizit auf 1 festlegen.If your script uses RevoScaleR functions (generally prefixed with "rx"), parallel processing is performed automatically and you do not need to explicitly set @parallel to 1.

    Wenn das R-Skript und die SQL-Abfrage parallelisiert werden können, dann erstellt die Datenbank-Engine mehrere parallele Prozesse.If the R script can be parallelized, and if the SQL query can be parallelized, then the database engine creates multiple parallel processes. Die maximale Anzahl von Prozessen, die erstellt werden kann, entspricht der Einstellung für die max. Grad an Parallelität (MAXDOP) für die Instanz.The maximum number of processes that can be created is equal to the maximum degree of parallelism (MAXDOP) setting for the instance. Alle Prozesse führen dann dasselbe Skript aus, empfangen aber nur einen Teil der Daten.All processes then run the same script, but receive only a portion of the data.

    Diese Methode ist also nicht nützlich für Skripts, die alle Daten sehen müssen, wie z. B. beim Trainieren eines Modells.Thus, this method is not useful with scripts that must see all the data, such as when training a model. Es ist jedoch nützlich, wenn Tasks wie die Batchvorhersage parallel ausgeführt werden.However, it is useful when performing tasks such as batch prediction in parallel. Weitere Informationen zur Verwendung von Parallelität mit sp_execute_external_script finden Sie im Abschnitt Tipps für Fortgeschrittene: parallele Verarbeitung in Verwenden von R-Code in Transact-SQL.For more information on using parallelism with sp_execute_external_script, see the Advanced tips: parallel processing section of Using R Code in Transact-SQL.

  • Verwenden Sie numTasks =1.Use numTasks =1. Wenn Sie RX-Funktionen in einem SQL Server-Computekontext verwenden, legen Sie den Wert des Parameters numTasks auf die Anzahl der Prozesse fest, die Sie erstellen möchten.When using rx functions in a SQL Server compute context, set the value of the numTasks parameter to the number of processes that you would like to create. Die Anzahl der erstellten Prozesse kann nie mehr als MAXDOP sein. Die tatsächliche Anzahl der erstellten Prozesse wird jedoch von der Datenbank-Engine bestimmt und ist möglicherweise kleiner als Sie angefordert haben.The number of processes created can never be more than MAXDOP; however, the actual number of processes created is determined by the database engine and may be less than you requested.

    Wenn das R-Skript und die SQL-Abfrage parallelisiert werden können, dann erstellt SQL Server mehrere parallele Prozesse, wenn die Rx-Funktionen ausgeführt werden.If the R script can be parallelized, and if the SQL query can be parallelized, then SQL Server creates multiple parallel processes when running the rx functions. Die tatsächliche Anzahl der erzeugten Prozesse hängt von verschiedenen Faktoren ab.The actual number of processes that are created depends on a variety of factors. Dazu zählen Ressourcenkontrolle, aktuelle Verwendung von Ressourcen, andere Sitzungen und der Abfrageausführungsplan für die mit dem R-Skript verwendete Abfrage.These include resource governance, current usage of resources, other sessions, and the query execution plan for the query used with the R script.

Parallelisierung der AbfragenQuery parallelization

Sie können in Microsoft R Sie mit SQL Server-Datenquellen arbeiten, indem Sie die Daten als RxSqlServerData-Datenquellenobjekt definieren.In Microsoft R, you can work with SQL Server data sources by defining your data as an RxSqlServerData data source object.

Erstellt eine Datenquelle auf der Grundlage einer gesamten Tabelle oder Ansicht:Creates a data source based on an entire table or view:

RxSqlServerData(table= "airline", connectionString = sqlConnString)

Erstellt eine Datenquelle auf der Grundlage einer SQL-Abfrage:Creates a data source based on a SQL query:

RxSqlServerData(sqlQuery= "SELECT [ArrDelay],[CRSDepTime],[DayOfWeek] FROM  airlineWithIndex WHERE rowNum <= 100000", connectionString = sqlConnString)

Hinweis

Wenn anstatt einer Abfrage eine Tabelle in der Datenquelle angegeben ist, verwendet R Services interne Heuristik, um die erforderlichen Spalten zum Abrufen aus der Tabelle zu ermitteln. Dieser Ansatz wird jedoch nicht in einer parallelen Ausführung enden.If a table is specified in the data source instead of a query, R Services uses internal heuristics to determines the necessary columns to fetch from the table; however, this approach is unlikely to result in parallel execution.

Um sicherzustellen, dass die Daten parallel analysiert werden können, sollte die Abfrage zum Abrufen der Daten so eingeschlossen werden, dass die Datenbank-Engine einen Plan für die parallele Abfrage erstellen kann.To ensure that the data can be analyzed in parallel, the query used to retrieve the data should be framed in such a way that the database engine can create a parallel query plan. Wenn der Code oder Algorithmus große Datenmengen verwendet, stellen Sie sicher, dass die für RxSqlServerData angegebene Abfrage für die parallele Ausführung optimiert ist.If the code or algorithm uses large volumes of data, make sure that the query given to RxSqlServerData is optimized for parallel execution. Eine Abfrage, die nicht zu einem parallelen Ausführungsplan führt, kann zu einem einzelnen Prozess für die Berechnung führen.A query that does not result in a parallel execution plan can result in a single process for computation.

Wenn Sie mit großen Datasets arbeiten müssen, verwenden Sie Management Studio oder einen anderen SQL Query Analyzer, bevor Sie den R-Code zur Analyse des Ausführungsplans ausführen.If you need to work with large datasets, use Management Studio or another SQL query analyzer before you run your R code, to analyze the execution plan. Führen Sie dann die empfohlenen Schritte aus, um die Leistung der Abfrage zu verbessern.Then, take any recommended steps to improve the performance of the query. Ein fehlender Index für eine Tabelle kann z.B. die Zeit zum Ausführen einer Abfrage beeinträchtigen.For example, a missing index on a table can affect the time taken to execute a query. Weitere Informationen finden Sie unter Überwachen und Optimieren der Leistung.For more information, see Monitor and Tune for Performance.

Ein weiterer häufiger Fehler, die die Leistung beeinträchtigen könnte, besteht darin, wenn die Abfrage mehr Spalten als erforderlich aufruft.Another common mistake that can affect performance is that a query retrieves more columns than are required. Wenn eine Formel beispielsweise auf nur drei Spalten basiert, die Quelltabelle jedoch 30 Spalten enthält, verschieben Sie die Daten unnötig.For example, if a formula is based on only three columns, but your source table has 30 columns, you are moving data unnecessarily.

  • Vermeiden Sie, SELECT *zu verwenden.Avoid using SELECT *!
  • Nehmen Sie sich etwas Zeit, um die Spalten im Dataset zu überprüfen und nur die für die Analyse benötigten Elemente zu identifizieren.Take some time to review the columns in the dataset and identify only the ones needed for analysis
  • Entfernen Sie aus den Abfragen alle Spalten, die Datentypen enthalten, die mit R-Code nicht kompatibel sind, z. B. GUIDs und rowguids.Remove from your queries any columns that contain data types that are incompatible with R code, such as GUIDS and rowguids
  • Überprüfen auf nicht unterstützte Datums- und UhrzeitformateCheck for unsupported date and time formats
  • Anstatt eine Tabelle zu laden, erstellen Sie eine Ansicht, mit der bestimmte Werte ausgewählt oder Spalten umgewandelt werden, um Konvertierungsfehler zu vermeiden.Rather than load a table, create a view that selects certain values or casts columns to avoid conversion errors

Optimieren des Machine Learning-AlgorithmusOptimizing the machine learning algorithm

Dieser Abschnitt enthält verschiedene Tipps und Ressourcen, die für RevoScaleR und andere Optionen in Microsoft R spezifisch sind.This section provides miscellaneous tips and resources that are specific to RevoScaleR and other options in Microsoft R.

Tipp

Eine allgemeine Erläuterung der R-Optimierung ist nicht Teil dieses Artikels.A general discussion of R optimization is out of the scope of this article. Wenn Sie Ihren Code jedoch schneller machen müssen, empfiehlt es sich, den Artikel Das R-Inferno zu lesen.However, if you need to make your code faster, we recommend the popular article, The R Inferno. Er behandelt Programmierkonstrukte in R, beschreibt häufige Fehler in anschaulicher Sprache und im Detail und bietet viele spezifische Beispiele für R-Programmiertechniken.It covers programming constructs in R and common pitfalls in vivid language and detail, and provides many specific examples of R programming techniques.

Optimierungen für RevoScaleROptimizations for RevoScaleR

Viele RevoScaleR-Algorithmen unterstützen Parameter, um zu steuern, wie das Trainingsmodell generiert wird.Many RevoScaleR algorithms support parameters to control how the trained model is generated. Zwar sind die Genauigkeit und Richtigkeit des Modells wichtig, die Leistung des Algorithmus ist möglicherweise jedoch genauso wichtig.While the accuracy and correctness of the model is important, the performance of the algorithm might be equally important. Um das richtige Gleichgewicht zwischen der Genauigkeit und der Trainingszeit zu erzielen, können Sie Parameter zum Beschleunigen der Berechnung ändern, und in vielen Fällen können Sie die Leistung verbessern, ohne die Genauigkeit und Richtigkeit zu reduzieren.To get the right balance between accuracy and training time, you can modify parameters to increase the speed of computation, and in many cases, improve performance without reducing the accuracy or correctness.

  • rxDTreerxDTree

    rxDTree unterstützt den maxDepth-Parameter, der die Tiefe der Entscheidungsstruktur steuert.rxDTree supports the maxDepth parameter, which controls the depth of the decision tree. Wenn maxDepth erhöht wird, kann die Leistung beeinträchtigt werden. Daher ist es wichtig, die Vorteile einer größeren Tiefe im Vergleich zu den Auswirkungen auf die Leistung zu analysieren.As maxDepth is increased, performance can degrade, so it is important to analyze the benefits of increasing the depth vs. hurting performance.

    Sie können ebenfalls das Gleichgewicht zwischen Zeitkomplexität und Vorhersagegenauigkeit steuern, indem Sie Parameter wie maxNumBins, maxDepth, maxComplete und maxSurrogate anpassen.You can also control the balance between time complexity and prediction accuracy by adjusting parameters such as maxNumBins, maxDepth, maxComplete, and maxSurrogate. Das Erhöhen der Tiefe auf mehr als 10 oder 15 kann die Berechnung sehr teuer machen.Increasing the depth to beyond 10 or 15 can make the computation very expensive.

  • rxLinModrxLinMod

    Verwenden Sie das cube-Argument, wenn die erste abhängige Variable der Formel eine Faktorvariable ist.Try using the cube argument if the first dependent variable in the formula is a factor variable.

    Wenn der cube-Wert auf TRUE festgelegt ist, erfolgt die Regression mithilfe einer partitionierten Inverse, die möglicherweise schneller ist und weniger Arbeitsspeicher beansprucht als die Berechnung durch Standardregression.When cube is set to TRUE, the regression is performed using a partitioned inverse, which might be faster and use less memory than standard regression computation. Wenn die Formel über eine große Anzahl von Variablen verfügt, kann die Leistungssteigerung erheblich sein.If the formula has a large number of variables, the performance gain can be significant.

  • rxLogitrxLogit

    Verwenden Sie das cube-Argument, wenn die erste abhängige Variable eine Faktorvariable ist.Use the cube argument if the first dependent variable is a factor variable.

    Wenn cube auf TRUE festgelegt ist, verwendet der Algorithmus eine partitionierte Inverse, die möglicherweise schneller ist und weniger Arbeitsspeicher beansprucht.When cube is set to TRUE, the algorithm uses a partitioned inverse, which might be faster and use less memory. Wenn die Formel über eine große Anzahl von Variablen verfügt, kann die Leistungssteigerung erheblich sein.If the formula has a large number of variables, the performance gain can be significant.

Weitere Informationen zur Optimierung von RevoScaleR finden Sie in den folgenden Artikeln:For more information on optimization of RevoScaleR, see these articles:

Verwenden von MicrosoftMLUse MicrosoftML

Außerdem wird empfohlen, dass Sie sich das neue MicrosoftML-Paket ansehen, das skalierbare Machine Learning-Algorithmen bereitstellt, die die von RevoScaleR bereitgestellten Computekontexte und Transformationen verwenden können.We also recommend that you look into the new MicrosoftML package, which provides scalable machine learning algorithms that can use the compute contexts and transformations provided by RevoScaleR.

Nächste SchritteNext steps