Stream - limitation du système de fichiers
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour à tous,
J'ai un problème lors de l'écriture sur un gros fichier. Mon application à pour rôle de concaténer deux gros fichiers (>20Go) en retirant les doublons.
Tout se passe correctement jusqu'à ce que le fichier soit devenue assez gros (entre 3.5Go et 4Go), et là j'ai une exception :
Le code de la fonction qui se charge de l'écriture est :
Quelqu'un aurai une idée ?
Pour info, je suis sous un système 64bits, sur un disque en ntfs.
naga
PS : j'ai essayé d'écrire bit à bit et à un moment donné, chaque appel à une methode de stream lève l'exception
J'ai un problème lors de l'écriture sur un gros fichier. Mon application à pour rôle de concaténer deux gros fichiers (>20Go) en retirant les doublons.
Tout se passe correctement jusqu'à ce que le fichier soit devenue assez gros (entre 3.5Go et 4Go), et là j'ai une exception :
Impossible de terminer l opération demandée du fait d'une limitation du système de fichiers.
Le code de la fonction qui se charge de l'écriture est :
private void Ecrire(string sLigne)
{
using(StreamWriter sw = new StreamWriter(sFicDest,true,Encoding.UTF8))
{
sw.WriteLine(sLigne);
}
}
Quelqu'un aurai une idée ?
Pour info, je suis sous un système 64bits, sur un disque en ntfs.
naga
PS : j'ai essayé d'écrire bit à bit et à un moment donné, chaque appel à une methode de stream lève l'exception
A voir également:
- Stream dispose c#
- Votre appareil ne dispose pas des correctifs de qualité et de sécurité importants - Guide
- Ace stream - Télécharger - Lecture
- Popcorn stream - Télécharger - TV & Vidéo
- Stream mis en pause discord - Forum Audio
- Full stream ✓ - Forum Mozilla Firefox
1 réponse
Salut,
si ton apli utilise le .NET 4, il y a les MemoryMappedFile avec ses streams créés par MemoryMappedFile.CreateViewStream.
Sinon, pour du .NET < 4, j'espère que tu utilises des buffers codés manuellement pour ton appli, car laisser l'OS gérer le buffering de très gros fichiers ça passe pas.
Utiliser un BufferedStream améliore grandement les performances en lisant le fichier bloc par bloc. Ce code lit le fichier ligne par ligne mieux qu'avec un simple FileStream:
Selon ce que je comprends, ton appli est censée trouver les doublons, ça dépend quels genre de doublons mais tu peux utiliser l'algorithme de Rabin-Karp pour ce genre de tâches.
si ton apli utilise le .NET 4, il y a les MemoryMappedFile avec ses streams créés par MemoryMappedFile.CreateViewStream.
Sinon, pour du .NET < 4, j'espère que tu utilises des buffers codés manuellement pour ton appli, car laisser l'OS gérer le buffering de très gros fichiers ça passe pas.
Utiliser un BufferedStream améliore grandement les performances en lisant le fichier bloc par bloc. Ce code lit le fichier ligne par ligne mieux qu'avec un simple FileStream:
using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))Les BufferedStream peuvent prendre un 2e argument en constructeur: la taille du buffer, de 4Kio (4096 octets) par défaut; il se peut qu'augmenter ou diminuer cette valeur peut améliorer (ou dégrader) la performance selon le type de support de stockage.
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string line;
while ((line = sr.ReadLine()) != null)
{
// Le traitement.
}
}
Selon ce que je comprends, ton appli est censée trouver les doublons, ça dépend quels genre de doublons mais tu peux utiliser l'algorithme de Rabin-Karp pour ce genre de tâches.
J'ai donc fais ce code :
et une fois de plus l'exception apparait (au caractère 4094 ... d'après ce que tu me dis ce n'est peu être pas un hasard ;] )
J'ai donc géré l'exception de cette manière :
et il semblerai que là ca passe. J'ai lancé le test, mais bon il faut que j'arrive à environ 13/14 go de données traitées pour qu'il apparaisse. Je te redirai ;)
naga
Donc non ca ne passait pas, le problème venait bien du buffer ! Je suis toujours en train de tester, mais il semble que cette fois ca fonction. Voilà donc mon code :
merci pour ton aide, ca m'a beaucoup "éclairé".
naga