Question

Il y a des fichiers texte (enregistrements) auxquels j'ai besoin d'accéder en utilisant C # .Net. Mais le problème est que ces fichiers dépassent 1 Go. (taille minimale: 1 Go)

Que devrais-je faire? Quels sont les facteurs sur lesquels je dois me concentrer?

Quelqu'un peut-il me donner une idée pour surmonter cette situation?

EDIT:

Merci pour les réponses rapides. oui ce sont des enregistrements de longueur fixe. Ces fichiers texte provenant d'une entreprise locale. (Il y a les enregistrements de transaction du mois dernier)

Est-il possible d'accéder à ces fichiers comme des fichiers texte normaux (en utilisant un flux de fichiers normal).

et

Qu'en est-il de la gestion de la mémoire ????

Était-ce utile?

La solution

Développer la réponse de CasperOne

En termes simples, il n’ya aucun moyen de mettre en mémoire de manière fiable un fichier de 100 Go à la fois. Sur une machine 32 bits, l'espace d'adressage est tout simplement insuffisant. Sur un ordinateur 64 bits, l'espace d'adressage est suffisant, mais pendant le temps nécessaire à la mémorisation du fichier, votre utilisateur aura tué votre processus par frustration.

L'astuce consiste à traiter le fichier de manière incrémentielle. La classe de base System.IO.Stream () est conçue pour traiter un flux variable (et éventuellement infini) en quantités distinctes. Il a plusieurs méthodes de lecture qui ne progresseront dans un flux que d'un nombre d'octets spécifique. Vous devrez utiliser ces méthodes pour diviser le flux.

Je ne peux pas donner plus d'informations car votre scénario n'est pas assez spécifique. Pouvez-vous nous donner plus de détails ou vos délimètres d’enregistrement ou des exemples de lignes du fichier?

Mettre à jour

S'il s'agit d'enregistrements de longueur fixe, System.IO.Stream fonctionnera parfaitement. Vous pouvez même utiliser File.Open () pour accéder à l'objet Stream sous-jacent. Stream.Read a une surcharge qui demande le nombre d'octets à lire dans le fichier. Comme ce sont des enregistrements de longueur fixe, cela devrait bien fonctionner pour votre scénario.

Aussi longtemps que vous n'appelez pas ReadAllText () et utilisez les méthodes Stream.Read () qui prennent des tableaux d'octets explicites, la mémoire ne sera pas un problème. La classe Stream sous-jacente veillera à ne pas mettre le fichier entier en mémoire (bien sûr, sauf si vous le lui demandez :)).

Autres conseils

Vous ne citez pas spécifiquement les problèmes à résoudre. Un fichier peut peser jusqu'à 100 Go et vous ne pouvez rencontrer aucun problème pour le traiter.

Si vous devez traiter le fichier dans son ensemble , cela nécessitera un codage créatif, mais si vous pouvez simplement traiter des sections du fichier à la fois, il est relativement facile de déplacez-vous vers l'emplacement du fichier à partir duquel vous devez commencer, traitez les données que vous devez traiter en morceaux, puis fermez le fichier.

Plus d'informations ici seraient certainement utiles.

Quels sont les principaux problèmes que vous rencontrez en ce moment? La chose importante à retenir est de penser en termes de flux - c’est-à-dire de garder le minimum de données en mémoire que vous pouvez. LINQ est excellent pour travailler avec des séquences (bien que certaines opérations de mise en mémoire tampon que vous devez éviter, telles que OrderBy).

Par exemple, voici un moyen simple de gérer enregistre efficacement un fichier volumineux (notez le bloc itérateur).

Pour effectuer plusieurs agrégats / analyses sur des données volumineuses à partir de fichiers, pensez à Appuyez sur LINQ dans MiscUtil .

Pouvez-vous ajouter plus de contexte aux problèmes auxquels vous pensez?

Développer la réponse de JaredPar.

Si le fichier est un fichier binaire (c'est-à-dire une taille de 4 octets, des chaînes de longueur fixe, etc.), vous pouvez utiliser la classe BinaryReader. Plus facile que d'extraire n octets, puis d'essayer de l'interroger.

Notez également que la méthode de lecture sur System.IO.Stream est une opération non bloquante. Si vous demandez 100 octets, il peut en retourner moins, mais n’a toujours pas atteint la fin du fichier.

La méthode BinaryReader.ReadBytes bloquera jusqu’à ce qu’elle lise le nombre d’octets demandé, ou la fin du fichier - selon la première occurrence.

Jolis garçons de collaboration:)

Hé les gars, je réalise que ce message n’a pas été touché depuis un moment, mais je voulais simplement publier un site qui présente la solution à votre problème.

http: //thedeveloperpage.wordpress.com/c-articles/using-file-streams-to-write-any-size-file-introduction/

J'espère que ça aide!

-CJ

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top