Eléments de réflexion autour des jeux de données trop grands pour tenir en mémoire.
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Les ordinateurs portables ont en moyenne 8 Go de mémoire, les machines de bureau peuvent aller bien au-delà, monter jusqu'à 1 To de mémoire vive. 8Go suffisent pour la plupart des usages. Que faire quand cela ne suffit pas ? Chaque section propose une direction.
C'est le premier réflexe. On regarde les données avec un échantillon aléatoire qui tient en mémoire et avec lequel les calculs prennent un temps raisonnable.
Beaucoup de librairies de machine learning utilise des float et non double. La précision est moindre mais peut n'a-t-on besoin de cette précision pour les calculs. Il en va de même pour les entiers. Si on sait qu'une variable prend ses valeurs entre 0 et 255, un octet pour représenter chaque entier.
Beaucoup de grandes matrices sont creuses : la plupart des coefficients sont nulles. Cela est souvent le cas pour les matrice d'adjacence des graphes. Dans ce cas, il est avantageux de ne stocker que les coefficients non nuls et d'utiliser les opérations matricielles adéquates de sorte que les zéros ne soient jamais présents en mémoire.
On ne stocke en mémoire que les coefficients non nuls et leurs coordonnées. C'est une façon de compresser l'information. Il existe plusieurs formats. Le plus usité est le format CSR pour Compressed sparse row. Ce n'est pas le seul. Pour une matrice symétrique, on ne mémorisera que la moitié des coefficients. Il n'existe pas de meilleur format en général mais un meilleur format adapté à un usage.
Certains calculs ne nécessitent d'avoir toutes les données en mémoire. C'est le cas d'une moyenne et typiquement de tout calcul s'appuyant sur une logique SQL ou Map/Reduce. On place les données dans une base de données SQL. On manipule les données en SQL, on ne charge en mémoire que ce qui est nécessaire.
Les données sont compressées pour prendre moins de place. Les calculs nécessitent alors que les matrices soient décompressés avant les calculs puis les résultats compressés. Le module h5py est couramment utilisé et souvent via un autre module qui masque le fait que les données sont compressées. blosc est un autre module de compression, voir aussi python-blosc.
Certaines structures de données sont récurrentes et certaines librairies ont été implémentées pour les manipuler.
C'est une option pas toujours évidente à mettre en place car elle implique d'écrire différemment les algorithmes.
La sérialisation permet de gagner du temps lors de l'écriture et la lecture d'objet. Les objets sont enregistrés dans un format très proche de celui qu'il a en mémoire. Le chargement des données est très rapide. Pour un dataframe, le fait de sérialiser évite toutes les opérations de conversion des nombres au format numérique. Ce processus est très pratique pour les gros dataframe.