2017-09-28 4 views
1

J'ai un grand fichier csv de taille ~ 5-6GB (millions de lignes). Donc les pandas ne peuvent pas le gérer (cela donne une erreur de mémoire car ma capacité de mémoire vive est de 2 Go). Je veux utiliser Hadoop dessus (c'est-à-dire, stocker le bloc de chaque fichier sur différents noeuds) alors comment le démarrer et quelles bases de données Hadoop (Hive, HBase, PIG) j'utilise pour effectuer des opérations sur chaque bloc. Si quelque chose ne va pas avec la question alors s'il vous plaît laissez-moi savoir que je suis un débutant dans ce domaine. Ou plutôt que hadoop puis-je stocker ces énormes fichiers CSV dans SQL ou Postgres si oui alors comment? Merci.Comment puis-je stocker, récupérer (et effectuer la fusion) de gros fichiers csv avec python.

Répondre

1

Les pandas peuvent gérer de gros fichiers en lisant le fichier en morceaux. Si vous fournissez le paramètre chunksize à la fonction pd.read_csv(), un TextFileReader sera retourné, et vous pourrez le parcourir en faisant des opérations sur chaque mandrin qui correspond à la mémoire.

Voici un exemple qui lit 1000 lignes à la fois et faire l'opération sur chaque morceau:

reader = pd.read_csv('your_file.csv', chunksize=1000) 
for chunk in reader: 
    # do operations on chuck which is a dataframe with 1000 rows. 

Remarque, les opérations que vous faites sur chaque mandrin doit agréger ou réduire la taille du mandrin, et non stockez-les dans une liste, sinon vous manquerez de mémoire. Si vous devez effectuer des opérations sur des colonnes, vous ne réduirez pas la taille finale du DataFrame, puis, après avoir opéré sur chaque mandrin, enregistrez le résultat dans un fichier.

+0

Merci pour la réponse, mais je ne veux pas le morceau csv et effectuer l'opération sur elle. J'ai besoin d'une solution où je peux d'abord déplacer toutes les données de la fille vers la base de données (j'ai essayé SQL mais cela a pris trop de temps) et de là je peux récupérer un ensemble de colonnes, effectuer quelques opérations et stocker les résultats base de données. Quelle base de données devrais-je utiliser? (Toute grande base de données qui fonctionne mieux avec python). –

0

Vous pouvez toujours le lire comme un fichier texte normal et analyser les lignes par ligne. Vous pouvez faire un traitement wahtever dessus.

quelque chose comme:

Header = [] 
with open('CSVFile.name' ], 'r') as InputFile: 
    for Line in InputFile : 
    PureData = re.split(Separator, Line[:-1]) 
    # assume 1st line is header 
    if not Header : 
     Header = PureData 
    else : 
     MyRecord = map(lambda x, y: { x, y }, Header, PureData) 

     print(str(MyRecord)) 
+0

Merci pour la réponse, mais je ne veux pas diviser le csv et effectuer une opération dessus. J'ai besoin d'une solution où je peux d'abord déplacer toutes les données de la fille vers la base de données (j'ai essayé SQL mais cela a pris trop de temps) et de là je peux récupérer un ensemble de colonnes, effectuer quelques opérations et stocker les résultats base de données. Quelle base de données dois-je utiliser? (Toute grande base de données de données qui fonctionne mieux avec python) –

+0

Si vous n'avez pas besoin de modifier les données dans la base de données, regardez quelque chose comme elasticsearch. Il est très efficace dans la recherche de divers "point de vue", en particulier sur DB énorme et des outils comme logstach gérera votre doigt csv 2 ELK dans le nez. – NeronLeVelu