lire un fichier texte de 500 000 lignes le plus rapidement

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

lire un fichier texte de 500 000 lignes le plus rapidement

Message par dayvid »

Salut !

Je suis confronter as un gros problème car
dans mon programme je doit lire un fichier texte
et l'afficher dans un editor gadget

Rien de plus simple, seulement mon
fichier texte fais plus de 500 000 lignes

Mais peut importe ont s'en fout de sa
le défi la dans est de le lire le plus rapidement qui soit
car le lire et afficher les information dans l'editor
gadget met 5 plombe, c'est très rapide
mais trop lent pour les fichier très volumineux

Comment fait le bloc note pas exemple ou lui
seulement quelques secondes lui suffise
comment être aussi rapide avec pure basic ?

Alors j'ai bien une idée mais voilà c'est pas très simple
cella consisterais a copier le fichier X foix
puis de demander de lire le premier fichier les X premières lignes
par exemples 10000

En parallèle de sa avec un thread, demander de lire le deuxième fichier les X suivante lignes
par exemples a partir de la ligne 10001 jusqu'à met-on 20000

En parallèle de sa avec un autre thread, demander de lire le troisième fichier les X suivante lignes
par exemples a partir de la ligne 20001 jusqu'à met-on 30000

Etc avec tous les fichiers, cella permettrais de lire le fichier largement
plus vite, vous m'avez compris ?

Merci de m'aider :D
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: lire un fichier texte de 500 000 lignes le plus rapideme

Message par Backup »

une fois de plus , tu ne demande pas de l'aide , tu demande a ce qu'on te fasse le prg ! ;)

le principe consiste a precharger ton text en memoire
ou alors a charger ton text page par page ....
considerant que tu charge X lignes dans ton editeur , tu charge ton text , X lignes par x lignes

voila tu as l'algo a toi de bosser ! ;)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: lire un fichier texte de 500 000 lignes le plus rapideme

Message par nico »

IL SUFFIT JUSTE DE FAIRE UN:
ReadData(#Fichier, *Buffer, Longueur)
voir le fichier d'aide
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: lire un fichier texte de 500 000 lignes le plus rapideme

Message par dayvid »

Une petite démo serais bien je pense, merci
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: lire un fichier texte de 500 000 lignes le plus rapideme

Message par Backup »

dayvid a écrit :Une petite démo serais bien je pense, merci
certe !
mais on ne vas pas faire un exemple pour chaqu'un de tes problemes ..

et tout ce que tu as a savoir se trouve deja sur le forum
souvent je me prends a reposter des codes deja présent !!

c'est dommage que tu n'utilise pas plus, le bouton rechercher
voir aussi les tutos ....

tu n'aura pas de réponses si tu ne fais que poser des questions...
les gens qui viennent ici , travailles , ou son occupé sur des projets perso
ils n'ont pas forcement le temps de te faire un cours d'informatique !

par contre si tu post ton code , meme mal fais, tu aura plus de chance d'avoir des réponses ..

il me semble pourtant t'avoir deja dit ça .... ou un autre te l'a deja dit ... ;)

nico t'as fait une réponse

alors au lieu de demander encore plus (qu'on te fasse ton code)
tu colle la fonction qu'il t'a donné dans l'editeur puis tu met ton curseur dessus
puis tu presse F1

la doc va apparaitre comme par magie !!
Resultat = ReadData(#Fichier, *Buffer, Longueur)
Description

Lit le contenu du #Fichier et place les informations en mémoire à partir de l'adresse contenue dans le pointeur *Buffer. 'Longueur' précise le nombre d'octets à transférer.

Le nombre d'octets effectivement lus est renvoyé dans 'Resultat' (utile pour vérifier que la lecture s'est bien déroulée).

Vous trouverez un exemple d'utilisation avec la commande Lof().
voici l'exemple fourni avec la fonction LOF()


file$ = openfilerequester ( "Sélectionnez un fichier" , "" , "Text (.txt)|*.txt|All files (*.*)|*.*" ,0)
         If file$
                 If readfile (0, file$)
                        length = lof (0) ; Lit la taille en octets du fichier
                        *MemoryID = allocatememory (length) ; alloue un bloc mémoire de la taille du fichier
                         If *MemoryID
                                bytes = readdata (0, *MemoryID, length) ; Lit les données du fichier et les place dans le bloc mémoire
                                 Debug "Nombre d'octets lus: " + str (bytes)
                         EndIf
                         closefile (0)
                 EndIf
         EndIf


tout ça montre une certaine évidence a ne pas vouloir chercher par toi meme
, ne t'étonne pas si tu ne reçois plus de réponses !! :roll:
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: lire un fichier texte de 500 000 lignes le plus rapideme

Message par dayvid »

Merci infiniment pour votre aide :D

Heureusement que j'ai plein de fichier d'exemple moi
que je me suis fait car j'aurais bien bloquer même avec votre exemple :|

Ba oui c'est pas évident les axer en mémoire
mais j'y suis arriver, votre coup de pousse m'as fait bondir très haut, merci encore :D
voici ce que j'ai fait:

Code : Tout sélectionner

file$ = OpenFileRequester("Sélectionnez un fichier","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  
  If file$
    
    If ReadFile(0, file$) 
      
      length = Lof(0) ; Lit la taille en octets du fichier 
      *MemoryID = AllocateMemory(length) ; alloue un bloc mémoire de la taille du fichier "length"
      
      If *MemoryID ; si l'allacation a bien fonctionner ont continue
        ReadData(0, *MemoryID, length)   ; Lit les données du fichier et les place dans le bloc mémoire "*MemoryID" de la taille correspondant à "length"
        *Fichier.String = @*MemoryID ; "*Fichier" a pour valeur l'adresse où réside la chaîne de caractères en mémoire "*MemoryID"
        Fichier$ = *Fichier\s ; "Fichier$" à pour valeur le texte où réside la chaîne de caractères en mémoire "*MemoryID"
      EndIf
      
    Else
      MessageRequester("Information","Impossible d'ouvrir le fichier !")
      End
    EndIf
    
  EndIf
  
  AddGadgetItem(#Editor_0, -1, Fichier$)
C'est incroyable la vitesse a la quelle sa va 8O
encore plus vite que le bloc note dic donc :D
Salut et merci :D
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre