Partage
  • Partager sur Facebook
  • Partager sur Twitter

OUvrir un fichier CSV de plus de 100 Go

Sujet résolu
21 mars 2016 à 14:53:02

Bonjour à tous, j'ai un soucis pour lire un fichier CSV très volumineux (100 Go).

Je précise que je code sur python3, je ne travaille pas sur un serveur mais sur la RAM du PC (16Go de RAM). 

J'ai tenté d'ouvrir mon fichier avec ce code : 

fichier = open('file.csv','rb')
fichiercsv = csv.reader(file, delimiter=',')

fichier_campagne = pd.read_csv(file,sep=',',dtype='unicode')


Mais le % de RAM atteint 100% à partir de 63Go de fichier lu, connaissez-vous une méthode d'importation de fichier (lecture) qui consommerait moins de Go de RAM ? 

Merci 

  • Partager sur Facebook
  • Partager sur Twitter
21 mars 2016 à 15:38:10

As-tu vraiment besoin d’avoir accès à tout le contenu avant de pouvoir commencé ton traitement ?

  • Partager sur Facebook
  • Partager sur Twitter
per aspera ad astra – comp.lang.c FAQexplication pointeur
21 mars 2016 à 15:40:26

Je veux pas forcément le voir, je veux pouvoir importer le fichier dans python, appliquer des filtres et des aglorithmes déterministes.
  • Partager sur Facebook
  • Partager sur Twitter
21 mars 2016 à 15:51:32

Tu as mal compris la question, alors je reformule : ne peux tu pas appliquer tes filtres et autre savants calculs au fur et à mesure que tu lis les données ?

-
Edité par talpa 21 mars 2016 à 15:52:02

  • Partager sur Facebook
  • Partager sur Twitter
per aspera ad astra – comp.lang.c FAQexplication pointeur
21 mars 2016 à 16:05:41

Si je pourrai, mais je ne sais pas comment appliquer les filtres au fur et à mesure de la lecture du fichier. 

J'ai plus l'habitude de bosser directement une fois que le dataframe est crée. 

  • Partager sur Facebook
  • Partager sur Twitter
21 mars 2016 à 16:26:13

BENAMARAILAN a écrit:

J'ai plus l'habitude de bosser directement une fois que le dataframe est crée.

Peut être mais en l’occurrence ce n’est pas possible. Et le mettre en place n’est pas très compliqué : lire un bout du fichier, appliquer le traitement, recommencer. Un exemple tout bête avec un fichier ne contenant que des nombres entiers, je calcul la moyenne de chaque colonne.

means = None
count = 0
with open('nb.csv', 'r') as f:
    for line in f:
        count += 1
        list_ = list(map(int, line.split(',')))
        if means is None:
            means = [0]*len(list_)
        for i in range(len(list_)):
            means[i] += list_[i]

for i in range(len(list_)):
    means[i] /= count
    
print(means)

Quelque soit la taille du fichier, on n’a jamais en mémoire que la ligne actuelle et la somme cumulé jusqu’à présent. C’est à dire presque rien.

-
Edité par talpa 21 mars 2016 à 16:27:47

  • Partager sur Facebook
  • Partager sur Twitter
per aspera ad astra – comp.lang.c FAQexplication pointeur
21 mars 2016 à 16:53:09

Ce serait plus simple de répondre si on avait une idée des filtres que tu voulais utiliser et des données contenues dans ton csv.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
21 mars 2016 à 17:17:50

BENAMARAILAN a écrit:

J'ai plus l'habitude de bosser directement une fois que le dataframe est crée. 


Dans ce cas il n'y a plus qu'une seule solution :p

Plus sérieusement il faudrait que tu nous donne tout ton code et une idée de la forme de ton fichier csv comme le dit Jevani.

Il est peut-être possible que tu arrives à charger tout le contenu de ton fichier en mémoire avec Numpy et ses array (voir aussi cette fonction pour lire un fichier csv, attention elle ne renvoie pas un itérateur mais l'ensemble des données!), je ne connais pas le facteur de gain en mémoire en préférant les array Numpy aux listes Python.

Néanmoins même si la solution ci-dessus s'avère marcher, ce n'est pas la bonne solution! Dans des cas comme ça il n'y a qu'une seule bonne solution: traiter le fichier au fur et à mesure comme Talpa te l'a proposé.

  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2016 à 15:18:12

Bonjour à tous,

Désolé d'avoir tardé à répondre. 

Tout d'abord merci pour vos réponses qui m'ont été d'une grande aide. Après avoir essayé un peu toutes les solutions proposés, j'ai pu convaincre ma direction de me fournir un ordinateur plus puissant et qui contient plus de RAM. 

De plus avec mon collègue nous avons pu filtrer les données à la source, pour pouvoir ensuite les importer dans python et faire nos traitement et tout s'est bien déroulé. 

Merci encore pour votre aide. 

Cordialement

Ilan 

  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2016 à 15:24:31

Hahahha. Acheter un nouvel ordinateur n'est pas ce que j'appelle vraiment une solution, mais tant mieux si ça fonctionne de votre coté.
  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2022 à 19:04:41 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


13 octobre 2022 à 19:23:43 - Message modéré pour le motif suivant : Réponse à un déterrage


13 octobre 2022 à 19:33:53

@M.Ler. (DS) Bonjour, merci de ne pas déterrer d'ancien sujet résolu pour une nouvelle question. Merci de créer votre propre sujet avec son contexte.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter