2017-07-12 1 views
1

Veuillez excuser à l'avance s'il s'agit d'une question en double - J'ai cherché stackoverflow mais je n'ai pas trouvé cette question posée de cette façon. Je cours Python 2.7 sur mon ordinateur et depuis que j'ai commencé à travailler avec un ensemble de données de rangée de 8 million; J'ai reçu un message d'erreur indiquant que mon ordinateur manque de mémoire. Je reçois ce message dès que je télécharge l'ensemble de données _ Je ne commence même pas à le traiter.Python plante l'ordinateur en raison de la faible mémoire

Il a effectivement écrasé mon ordinateur entier plusieurs fois. Comme c'est mon ordinateur de travail, j'ai demandé à l'informatique de nettoyer ma mémoire virtuelle, d'augmenter la mémoire disponible et même de nettoyer ma HD. Mais comme prévu, je suis toujours en train de résoudre ce problème. Dans un cadre personnel, j'ai utilisé le bloc-notes python jupyter sur AWS pour résoudre ce problème - mais je n'ai pas cette option au travail.

Que recommanderiez-vous? Est-ce que pyspark est la meilleure façon de faire? Je suis nouveau à étincelle, y at-il quelque chose de semblable à cahier jupyter pour l'étincelle?

Merci beaucoup

+1

vous pouvez commencer downsampling votre ensemble de données, le choix d'un sous-ensemble aléatoire de lignes – Alessandro

+0

Ou vous pourriez traiter vos données en morceaux, supprimer les colonnes inutiles de chaque ligne, etc. Sans connaître les détails, il pourrait y avoir beaucoup de solutions à ce problème sans trouver un nouvel outil. – wflynny

+0

Je ne peux malheureusement pas sous-échantillonner les données - l'exigence est réelle - les 8 millions de lignes sont déjà un morceau - J'ai plusieurs ensembles de données comme celui que je voudrais fusionner; J'essaye d'établir un voyage de client et pour cela j'ai besoin de tout l'histoire de client - chaque transaction – jeangelj

Répondre

1

tl; dr: soit lu en morceaux, ou essayez mmap.

Ceci est principalement indépendant de python, puisque vous semblez essayer de charger plus de données dans votre mémoire principale que vous avez réellement RAM. Votre système d'exploitation essaiera de compenser en mettant des données excédentaires et/ou inutiles sur votre disque dur/ssd [ce qui est lent comme un enfer - un système Skylake peut atteindre plus de 30 Go/s, un SSD NVMe rapide peut-être 2 Go/s, et votre disque dur normal est dans la gamme 0.1GB/s]. Windows appelle cette mémoire virtuelle, sur Linux c'est swap et sur Mac je ne sais pas.

La solution habituelle consiste à traiter les données en morceaux. Supposons que vous ayez un fichier texte énigmatique avec des millions de lignes, alors vous pourriez traiter une ligne à la fois. Certains pseudo-code perlienne:

$FH = open ("myhugefile"); 
while ($line = getLine ($FH)) { 
    process ($line); 
} 
close $FH; 

Qu'est-ce que vous essayez de faire semble être plus comme ceci:

$FH = open ("myhugefile"); 
$array = new Array(); 
while ($line = getLine ($FH)) { 
    push ($array, $line); 
} 
close $FH; 
foreach ($line in $array) { 
    process ($line); 
} 

Depuis le $array est stocké dans la mémoire, la seconde approche aura des problèmes avec des jeux de données énormes .

Si bien sûr votre process() -fonction peut aussi produire beaucoup de données. Il peut donc être nécessaire de l'écrire sur le disque dur/SSD au lieu de l'enregistrer en mémoire.

Dans la conférence de construction du compilateur j'ai assisté à un autre étudiant utilisé mmap pour lire les fichiers dans son analyseur. Cela s'est avéré très rapide par rapport à ce que d'autres ont fait pour cette première affectation (cependant, d'autres ont rattrapé des affectations ultérieures, puisque son traitement réel était plus lent en raison d'une implémentation mauvaise/naïve).

Quoi qu'il en soit, l'idée de base derrière mmap est de laisser votre système d'exploitation mapper votre fichier dans votre mémoire. Il chargera alors dynamiquement le contenu pour vous, alors que vous pouvez y accéder comme vos objets mémoire normaux.

explication générique est disponible sur wikipedia: https://en.wikipedia.org/wiki/Mmap

python2 docs avec des exemples: https://docs.python.org/2/library/mmap.html (Semble assez facile)

+0

merci - ceci est très utile; Je vais tout essayer – jeangelj

+0

De rien. Pour de plus amples recherches: Vous pourriez également essayer de regarder la construction de SGBD. C'est-à-dire, comment produire un pipeline de traitement à partir d'une instruction SQL qui est (a) très rapide et (b) peut gérer d'énormes quantités de données. Ces gars ont beaucoup de bonnes astuces (mais certaines sont plutôt compliquées et probablement exagérées). Big data, par ex. hadoop et d'autres implémentations de réduction de carte font face à des défis similaires. Peut-être pourriez-vous utiliser quelque chose comme ça? – ArchimedesMP

+0

J'ai une infrasturcture hadoop que je peux utiliser - probablement avec Spark; mais je voulais comprendre s'il n'y a pas moyen de python - je vais certainement essayer l'approche chunk et mmap. Je pense finalement que je devrais passer à Spark, juste parce que les jeux de données se développent chaque année. JE VOUS REMERCIE – jeangelj