2016-02-19 2 views
1

Je travaille sur une application utilisant Python (3.4) et PyQt. Le but du programme est de gérer et analyser une grande quantité de données - jusqu'à environ 50 fichiers binaires, qui peuvent être d'une taille totale allant jusqu'à 2-3 Go. Lorsque j'ai essayé de charger quelques fichiers dans le programme, il ne répond plus pendant le chargement et prend ~ 1,5 Go de RAM juste pour continuer à fonctionner. Ma question est assez générale - quelles sont les méthodes possibles dans python/PyQt pour gérer de tels ensembles de données?Python - gérer des données volumineuses

+2

Ceci est impossible de répondre. Seulement une suggestion très générale: décomposer votre programme, et créer un noyau de calcul sans aucun (Py) Qt qui fait le traitement de vos 50 fichiers. Laissez-le fonctionner, voir comment il se comporte, optimiser. Ensuite, accrochez-le dans votre gui-app. En outre, avec ces tailles de processus, assurez-vous d'utiliser 64 bits python. – deets

+0

Non, j'apprécie le commentaire. Je ne cherche pas un "correctif" ou quelque chose, juste quelques suggestions à considérer et essayer de mettre en œuvre, alors merci –

+0

En supposant que les fichiers ne sont pas compressés, la quantité d'espace disque et la quantité de mémoire seront similaires pour des représentations binaires efficaces . Quel genre d'analyse faites-vous, et comment chargez-vous les fichiers? La plupart des analyses peuvent être effectuées en mode streaming. Une option serait de charger un fichier à la fois et d'extraire les informations dont vous avez besoin pour l'agrégation, en gardant seulement cela en mémoire. – Mack

Répondre

1

Vous pourriez envisager le format HDF5, qui peut accéder à l'aide h5py, pytables, ou d'autres paquets de python. Selon le format de données, HDF5 pourrait vous permettre d'accéder aux données sur le HD de manière efficace, ce qui signifie en pratique que vous pouvez économiser de la mémoire. L'inconvénient est qu'il nécessite un certain effort de votre part en tant que programmeur.

1

@deets l'a bien compris ... décomposer le problème.

La question est très large ... car elle ne décrit pas les besoins en aval. Alors permettez-moi de partager le cadre que j'ai eu à construire pour travailler avec ... la solution clé était d'utiliser HDF et de construire des services autour des structures de données dans le bulkstore ... cela m'a donné une bonne solution.

Mon application est divisée en

a) remote sources -> Collection Subsystem -> Bulkstore 
b) Bulkstore  -> BatchAnalysis   -> dyanmicstore 
c) dynamicstore -> webapp+visualization -> UI 

Le système de collecte est la collecte continue des journaux de toutes les régions de 30 langues, l'analyse syntaxique du XML et des lignes dans un annexant seul fichier HDF5 de langue bulkstore.

La taille du bulkstore varie selon la langue ... de 20G à 1 M < ...

Le batchanalysis (noyau de calcul '@deets) est conçu pour utiliser les dernières ~ événements 12M (mémoire liée) .

La clé est d'apprendre à structurer le magasin en vrac ... dans mon cas, je divise le magasin en vrac en quarts avec un indice de regard de côté maître dans tous les trimestres. Les services sont répartis dans la hiérarchie de classe suivante:

bulkstore (core HDF services) 
+- dataset (manage datasets/directory within HDF) 
    +- appdata  (my apps knowledge of logs across the datasets) 
     +- dynamicstore (output of batchanalysis are HDF's themselves) 

Hope this helps ...

1 astuce ... il y a un truc pour gérer des ensembles de données au sein d'un HDF ... par exemple. HDF avec de grandes données prend beaucoup de temps juste pour obtenir le répertoire des jeux de données.

Si vous avez besoin de traiter l'intéressé par la construction d'une solution Spark pour le BatchAnalysis ...