Page 1 sur 1

lire un fichier texte de 500 000 lignes le plus rapidement

Publié : dim. 03/oct./2010 1:29
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

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

Publié : dim. 03/oct./2010 8:27
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 ! ;)

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

Publié : dim. 03/oct./2010 12:59
par nico
IL SUFFIT JUSTE DE FAIRE UN:
ReadData(#Fichier, *Buffer, Longueur)
voir le fichier d'aide

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

Publié : dim. 03/oct./2010 13:02
par dayvid
Une petite démo serais bien je pense, merci

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

Publié : dim. 03/oct./2010 14:00
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:

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

Publié : dim. 03/oct./2010 14:14
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