Tfilestream : seek sur un très gros fichier

Résolu
simoryl Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 21 août 2007 - 20 août 2007 à 17:23
simoryl Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 21 août 2007 - 21 août 2007 à 12:27
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

simoryl Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 21 août 2007
21 août 2007 à 12:27
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'
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
20 août 2007 à 20:12
as tu essayé en faisant :

Stream.Position := Stream.Size - 5000000;
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
20 août 2007 à 20:20
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/
0
simoryl Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 21 août 2007
21 août 2007 à 00:22
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'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
21 août 2007 à 00:24
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.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
21 août 2007 à 00:32
...Et quand la mémoire globale dépasse 4Go, c'est Windows qui s'occupe d'en fournir.
Ca vient de là, à mon avis.
0
Utilisateur anonyme
21 août 2007 à 04:25
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.
0
simoryl Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 21 août 2007
21 août 2007 à 11:19
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'
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
21 août 2007 à 11:26
"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...
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
21 août 2007 à 12:26
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
0
Rejoignez-nous