82 votes

De très grandes matrices utilisant Python et NumPy

NumPy est un outil très utile de bibliothèque, et de l'utiliser, j'ai trouvé qu'il est capable de manipuler des matrices qui sont assez grandes (10000 x 10000) facilement, mais commence à se battre avec quelque chose de beaucoup plus grand (en essayant de créer une matrice de 50000 x 50000 échoue). Évidemment, c'est en raison des énormes besoins en mémoire.

Est-il est un moyen de créer d'énormes matrices nativement dans NumPy (disons 1 m par 1 m) d'une certaine façon (sans avoir plusieurs terra-octets de RAM)?

89voto

Stephen Simmons Points 1921

PyTables et NumPy sont la voie à suivre.

PyTables va stocker les données sur le disque au format HDF, avec une option de compression. Mon jeux de données souvent obtenez 10x compression, ce qui est pratique lorsque vous traitez avec des dizaines ou des centaines de millions de lignes. Il est également très rapide; mes 5 ans d'ordinateur portable peut traiter des données en faisant SQL comme GROUPE PAR l'agrégation de 1 000 000 de lignes/seconde. Pas mal pour un Python à base de solution!

L'accès aux données en tant que NumPy recarray nouveau est aussi simple que:

data = table[row_from:row_to]

Le HDF bibliothèque prend en charge la lecture dans les segments de données et de conversion de NumPy.

55voto

Roberto Bonvallet Points 6336

numpy.arrays sont destinés à vivre dans la mémoire. Si vous souhaitez travailler avec des matrices de plus de votre mémoire, vous avez à travailler autour de cela. Il y a au moins deux approches que vous pouvez suivre:

  1. Essayez un plus efficace de la matrice de représentation qui exploite toute la structure spéciale que votre matrices ont. Par exemple, comme d'autres l'ont déjà souligné, il y a efficace des structures de données pour les matrices creuses (matrices avec beaucoup de zéros), comme scipy.sparse.csc_matrix.
  2. Modifier votre algorithme de travailler sur submatrices. Vous pouvez lire à partir du disque seulement la matrice de blocs qui sont actuellement utilisées dans les calculs. Des algorithmes conçus pour s'exécuter sur des clusters travaillent habituellement blockwise, puisque les données sont scatted sur différents ordinateurs, et est passé uniquement lorsque cela est nécessaire. Par exemple, le Renard algorithme de multiplication de matrice (fichier PDF).

30voto

DopplerShift Points 612

Vous devriez pouvoir utiliser numpy.memmap pour mapper en mémoire un fichier sur le disque. Avec les nouveaux ordinateurs python et 64 bits, vous devez disposer de l'espace d'adressage nécessaire, sans tout charger en mémoire. Le système d'exploitation ne doit gérer qu'une partie du fichier en mémoire.

24voto

Alex Martelli Points 330805

Pour gérer les matrices creuses, vous avez besoin du paquet scipy qui se trouve au-dessus de numpy - voir ici pour plus de détails sur les options de matrice creuse que scipy donne vous.

11voto

IfLoop Points 59461

Le post de Stefano Borini m'a amené à regarder à quel point ce genre de choses est déjà loin.

Ça y est. Il semble faire fondamentalement ce que vous voulez. HDF5 vous permettra de stocker de très grands ensembles de données, puis d'y accéder et de les utiliser de la même manière que NumPy.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X