Travailler avec le big data en python et numpy, pas assez de ram, comment sauvegarder des résultats partiels sur disque?

j'essaie d'implémenter des algorithmes pour des données à 1000 dimensions avec 200k+ points de données en python. Je veux utiliser numpy, scipy, sklearn, networkx et d'autres bibliothèques utiles. Je veux effectuer des opérations telles que la distance en paires entre tous les points et faire du clustering sur tous les points. J'ai mis en œuvre des algorithmes de travail qui exécutent ce que je veux avec une complexité raisonnable, mais quand j'essaie de les mettre à l'échelle de toutes mes données, je n'ai plus de mémoire vive. Bien sûr que oui, en créant la matrice. pour les distances sur 200k+ données prend beaucoup de mémoire.

voici le hic: je voudrais vraiment faire cela sur des ordinateurs merdiques avec de faibles quantités de ram.

Est-il possible pour moi de faire ce travail sans les contraintes de faible mémoire. Qu'il prendra beaucoup plus de temps n'est pas vraiment un problème, tant que le temps reqs ne pas aller à l'infini!

je voudrais pouvoir mettre mes algorithmes à l'œuvre et puis revenir d'une heure ou cinq plus tard et ne pas avoir coincé, car il a manqué de ram! Je voudrais implémenter ceci en python, et pouvoir utiliser les bibliothèques numpy, scipy, sklearn et networkx. Je voudrais pouvoir calculer la distance en paires à tous mes points etc

Est-ce faisable? Et comment pourrais-je faire, que puis-je commencer à lire sur?

meilleures salutations // Mesmer

30
demandé sur Saullo G. P. Castro 2013-04-22 18:36:25

2 réponses

en utilisant numpy.memmap vous créez des tableaux directement mappés dans un fichier:

import numpy
a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000))
# here you will see a 762MB file created in your working directory    

, Vous pouvez le traiter comme un réseau classique: a + = 1000.

il est même possible d'assigner plus de tableaux au même fichier, en le contrôlant à partir de sources mutuelles si nécessaire. Mais j'ai vécu des choses délicates ici. Pour ouvrir le tableau complet vous devez "fermer" le premier précédent, en utilisant del :

del a    
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000))

Mais l'ouverture de la table permet de réaliser le contrôle simultané:

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000))
b[1,5] = 123456.
print a[1,5]
#123456.0

Super! a a été modifié avec b . Et les changements sont déjà écrites sur le disque.

l'autre chose importante à commenter est le offset . Supposons que vous ne voulez pas prendre les 2 premières lignes dans b , mais les lignes 150000 et 150001.

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000),
                 offset=150000*1000*32/8)
b[1,2] = 999999.
print a[150001,2]
#999999.0

Maintenant vous pouvez accéder et mettre à jour n'importe quelle partie du tableau dans les opérations simultanées. Notez la taille des octets allant dans le calcul de l'offset. Donc, pour un "float64' cet exemple serait 150000*1000*64/8.

autres références:

40
répondu Saullo G. P. Castro 2017-05-23 12:18:01

vous pouvez simplement accélérer la mémoire virtuelle sur le système D'exploitation et utiliser Python 64 bits, à condition que ce soit un système d'exploitation 64 bits.

-3
répondu xorsyst 2013-05-01 13:33:17