10/10/2024
DuckDB dplyr, ou R de base ?
"Pour une analyse simple (calcul de moyenne par groupe sur 100 millions de lignes), duckdb s'est révélé 125 fois plus rapide que R de base et 28 fois plus rapide que l'association readr+dplyr, tout en évitant le chargement des données du disque en mémoire. Le package duckplyr permet d'intégrer les techniques de traitement analytique de DuckDB dans une API compatible avec dplyr. Pour en savoir plus, consultez les sites duckdb.org/docs/api/r et duckplyr.tidyverse.org."
J'ai voulu me rendre compte par moi-même de l'intérêt que suscitait DuckDB. DuckDB est un moteur de requêtes SQL open-source, très performant et en cours de traitement, conçu spécifiquement pour les tâches analytiques. Souvent appelé « sqlite for analytics », DuckDB est optimisé pour les charges de travail OLAP (Online Analytical Processing) - les données sont organisées par colonnes, ce qui signifie que la base de données est optimisée pour une lecture rapide et des requêtes complexes et volumineuses qui impliquent des filtrages, des agrégations et des jointures. Il est « intégré » dans le même sens que sqlite - il n'a pas de dépendances externes, pas de serveur SGBD à installer, à configurer et à maintenir. Il ne s'agit pas d'un processus séparé - il s'exécute au sein d'un processus hôte, ce qui lui confère l'avantage d'un transfert de données à grande vitesse vers et depuis la base de données ou, dans certains cas, d'une interrogation directe des données sans avoir à importer ou à copier la moindre donnée. Pour en savoir plus, consultez le site duckdb.org/why_duckdb.
*DuckDB et R*
DuckDB dispose d'une API R (voir la documentation). Vous pouvez installer le paquetage duckdb à partir du CRAN ou de GitHub. Pourquoi voudriez-vous utiliser DuckDB dans R ?
Grands ensembles de données : Lorsque vous avez des données trop volumineuses pour la mémoire, DuckDB peut interroger efficacement les données à partir du disque sans avoir besoin de l'ensemble des données en mémoire.
• *Requêtes de type SQL :* Si vous êtes plus à l'aise avec le langage SQL, DuckDB vous permet d'exécuter des requêtes SQL directement sur vos cadres de données R. Vous pouvez effectuer des opérations complexes telles que le groupage de données, l'analyse de données et l'analyse de données. Vous pouvez effectuer des opérations complexes telles que le regroupement, le filtrage, la jonction et l'agrégation, en utilisant la syntaxe SQL familière. Là encore, sans jamais lire de données en mémoire dans R.
• *Requêtes analytiques efficaces :* Pour les charges de travail impliquant de grandes agrégations ou des requêtes sur des millions de lignes, DuckDB peut traiter de grandes requêtes analytiques tout en minimisant l'encombrement de la mémoire et en maintenant des performances élevées.
• Restez dans R ! L'utilisation de DuckDB dans R vous permet d'utiliser DuckDB pour les requêtes analytiques les plus lourdes, en vous restituant les résultats dans un tableau que vous pouvez utiliser pour la visualisation ou une analyse plus poussée.
Comparaison de DuckDB avec dplyr et base R
Je voulais me faire une idée de la rapidité de DuckDB par rapport à base R et dplyr. Il s'agit d'une expérience simple : Je simulerai des données et les écrirai sur le disque, puis j'utiliserai base R, dplyr et duckdb pour lire les données, les grouper par variable et calculer la moyenne de deux colonnes différentes. C'est simple. Il existe d'autres benchmarks plus performants ailleurs (par exemple, voir les articles d'Appsilon ici).
*Simulation des données*
Le code ci-dessous simule 100 millions de lignes et quelques valeurs et dates aléatoires.
*Fonctions de traitement des données*
Les trois fonctions ci-dessous prennent un chemin de fichier, lisent les données1, calculent la moyenne de la valeur1 et de la valeur2 groupées par identifiant, et renvoient une liste des résultats résumés et le temps nécessaire pour effectuer l'analyse.
*duckplyr*
La méthode DBI + dbConnect() + dbGetQuery() avec SQL n'est pas la plus ergonomique ni la plus idiomatique pour lire et analyser des données en R. Bonne nouvelle : le package duckplyr pour R intègre les techniques de traitement de requêtes analytiques de DuckDB dans une API compatible avec dplyr. Pour en savoir plus, consultez le site duckplyr.tidyverse.org.
Ici, j'utilise la fonction duckplyr_df_from_file() pour « lire » les données à partir d'un fichier, tandis que les méthodes summarize et arrange remplacent les fonctions de dplyr par la version de duckplyr. Cette opération prend également ~3 secondes, et est beaucoup plus facile à lire avec les outils dplyr auxquels vous êtes habitués. Jetez un coup d'œil à l'article de blog de DuckDB sur duckplyr pour bien comprendre comment cela fonctionne.
*Aller plus loin*
Le « benchmark » ici était simple et limité, et je l'ai surtout utilisé comme une excuse pour en apprendre un peu plus sur duckdb et sur la façon de l'intégrer dans mon flux de travail. Dans ce benchmark, je n'ai pas essayé de séparer le temps passé à lire les données en mémoire du temps passé à les traiter, et l'« analyse » était une simple moyenne par groupe. Je n'ai pas essayé de paralléliser ou d'optimiser les approches de base de R ou de dplyr, et je n'ai rien fait avec data.table.
Pour des benchmarks plus complets, je recommande la lecture de quelques posts récents d'Appsilon sur l'utilisation de duckdb en R, pour les données volumineuses, et avec Shiny :
*R Dplyr ou DuckDB*
« R One Billion Row Challenge » : R est-il une option viable pour analyser d'énormes ensembles de données (en anglais)
*R Shiny et DuckDB*
Il y a aussi quelques présentations de la conférence posit::conf(2023) de l'année dernière sur l'utilisation de R avec DuckDB. Ces présentations sont disponibles sur YouTube.
*Stephen Turner.2024. _DuckDB vs dplyr vs base R_; R-bloggers*
_