2012-09-12 2 views
0

J'importe dans un panda DataFrame un répertoire de | -delimited.dat fichiers. Le code suivant fonctionne, mais je finis par manquer de RAM avec un MemoryError:.Mémoire efficace importer de nombreux fichiers de données dans panda DataFrame en Python

import pandas as pd 
import glob 

temp = [] 
dataDir = 'C:/users/richard/research/data/edgar/masterfiles' 
for dataFile in glob.glob(dataDir + '/master_*.dat'): 
    print dataFile 
    temp.append(pd.read_table(dataFile, delimiter='|', header=0)) 

masterAll = pd.concat(temp) 

Y at-il une approche plus efficace en mémoire? Ou devrais-je aller tout à fait à une base de données? (Je vais passer à une base de données par la suite, mais je suis bébé en passant mon mouvement vers les pandas.) Merci!

FWIW, voici la tête d'un exemple fichier .dat:

cik|cname|ftype|date|fileloc 
1000032|BINCH JAMES G|4|2011-03-08|edgar/data/1000032/0001181431-11-016512.txt 
1000045|NICHOLAS FINANCIAL INC|10-Q|2011-02-11|edgar/data/1000045/0001193125-11-031933.txt 
1000045|NICHOLAS FINANCIAL INC|8-K|2011-01-11|edgar/data/1000045/0001193125-11-005531.txt 
1000045|NICHOLAS FINANCIAL INC|8-K|2011-01-27|edgar/data/1000045/0001193125-11-015631.txt 
1000045|NICHOLAS FINANCIAL INC|SC 13G/A|2011-02-14|edgar/data/1000045/0000929638-11-00151.txt 

Répondre

3

Habituellement, si vous dérange utilisation de la mémoire, il est préférable d'utiliser des générateurs au lieu de créer une liste avant. Quelque chose comme:

dir_path = os.path.join(data_dir, 'master_*.dat') 
master_all = pd.concat(pd.read_table(data_file, delimiter='|', header=0) 
            for data_file in glob.glob(dir_path)) 

Ou vous pouvez écrire une fonction de générateur pour une version plus détaillée.

De toute façon cela ne résoudra pas le problème si la RAM ne suffit pas pour contenir le résultat final + un certain espace temporaire pour la liste d'un fichier complet (et probablement plus ... cela dépend du fonctionnement du garbage collector).

+0

Merci! Cela fonctionne mieux, mais je n'ai toujours pas de mémoire, alors je passe à une base de données. Merci pour la leçon sur les générateurs. –

+0

Eh bien, les générateurs ne sont pas vraiment spéciaux. Ils sont simplement "paresseux évalués" afin que vous puissiez traiter des données et ensuite les jeter, vous permettant d'avoir plus de mémoire libre. Mais si vous devez créer une chaîne de 6 Go avec seulement 4 Go de RAM, vous ne pouvez rien faire pour éviter les erreurs de mémoire ou d'échange. – Bakuriu

Questions connexes