Tfilestream : seek sur un très gros fichier

[Résolu]
Signaler
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
21 août 2007
-
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
21 août 2007
-
Salut,

Voilà, je cherche à faire un seek sur un gros fichier depuis la fin
dans le but de récupérer les 5 derniers Mo d'un fichier de 6Go.

Quand je fais un seek avec soFromEnd, il me met en position 0 et donc me recopie le fichier...

J'ai essayé de faire des seek successif depuis le début du fichier
pour arriver à la position souhaitée mais j'arrive au mieux à une
position de -294967296 octets et donc loin de mes 5Mo.

Est-ce que quelqu'un connait une solution à mon problème?

Merci

Simo'

10 réponses

Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
21 août 2007

En effet, en lisant un octet tous les 100000, j'arrive à parcourir mon fichier du début vers la fin (mais pas l'inverse). Bon benh ça marche du coup :-)

Merci pour cette pertinente remarque :-)

Simo'
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
as tu essayé en faisant :

Stream.Position := Stream.Size - 5000000;
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Si tu connais précisément la position dans le flux, pourquoi ne pas itérer en précisant soFromCurrent depuis la première recherche avec soFromEnd ?

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
21 août 2007

En fait, Stream.size me renvoi une valeur négatif (-700 milles et quelques)mais quelques recherches m'ont permis de constater que c'est un souci souvent rencontré avec un fichier très très gros.
J'ai essayé avec soFromCurrent depuis le début ou la fin mais sans succès. Depuis le début, il fini par bloquer vers 2Go et depuis la fin, il n'arrive jamais à se positionner et reste à la position 0.

Simo'
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Salut,

Il est où ton fichier?
Dans quel support de stockage?
La mémoire ou un fichier disque?

De toute façon, il est trop gros pour être dans la mémoire locale.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
...Et quand la mémoire globale dépasse 4Go, c'est Windows qui s'occupe d'en fournir.
Ca vient de là, à mon avis.

Salut,

"2Go" : ca serait pas un probleme de type ? tu aurait pas utiliser un integer par hasard? Si c'est le cas met le en Int64.
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
21 août 2007

je met bien en Int64 et en négatif quand j'utilise un soFromEnd. Sinon, le fichier est juste à côté de mon appli' sur le disque dur local.
Je précise qu'avec un fichier de 4.3Go c'est passé sans souci... Etrange...

Simo'
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
"J'ai essayé de faire des seek successifs depuis le début du fichier pour arriver à la position souhaitée..."
 Une idée comme ça...:
-Peut-être essayer de lire, ne serait-ce qu'un octet, entre chaque seek...
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
Bonjour

Une autre idée en passant. Tu utilises un int64 comme définition de type, ok mais utilises tu une constante typée ?

  Stream.Seek( 1 shl 31, soFromCurrent);
  // 1 shl 31 = -2147483648 considéré par défaut comme un Integer (32bits)

  Stream.Seek( int64(1 shl 31), soFromCurrent);
//  int64(1 shl 31) = 2147483648, on oblige le compilateur à traiter la constante en tant que int64

N.B. Cela expliquerait également pourquoi un fichier plus gros fonctionne. Dans ce cas là tu dépasses forcément la limite de valeur que peut contenir un entier 32 bits, et le compilateur utilises un int64 pour pouvoir la stocker.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein