2009-01-15 7 views
1

Il existe des fichiers texte (enregistrements) auxquels j'ai besoin d'accéder en utilisant C# .Net. Mais le problème est que ces fichiers sont plus grands que 1GB. (la taille minimale est de 1 Go)Flux de fichiers plus importants utilisant C#

Que devrais-je faire? Quels sont les facteurs sur lesquels je dois me concentrer? Est-ce que quelqu'un peut me donner une idée pour venir à bout de cette situation?

EDIT:

Merci pour les réponses rapides. oui, ils sont des enregistrements de longueur fixe. Ces fichiers texte proviennent d'une entreprise locale. (Il ya des enregistrements de transaction le mois dernier)

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

et

Que diriez-vous de la gestion de la mémoire ????

Répondre

4

L'expansion sur la réponse CasperOne

mis simplement il n'y a aucun moyen de mettre un fichier fiable de 100 Go en mémoire à un moment donné. Sur une machine 32 bits, il n'y a tout simplement pas assez d'espace d'adressage. Dans une machine 64 bits, il y a suffisamment d'espace d'adressage, mais pendant le temps nécessaire pour obtenir le fichier en mémoire, votre utilisateur aura tué votre processus par frustration.

L'astuce consiste à traiter le fichier de façon incrémentielle. La classe System.IO.Stream() de base 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 que dans un flux d'un nombre spécifique d'octets. 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élimiteurs d'enregistrements ou quelques exemples de lignes du fichier?

Mise à jour

Si elles sont des enregistrements de longueur fixe alors System.IO.Stream fonctionnera très bien. 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 fonctionner pour votre scénario.

Tant que vous n'appelez pas ReadAllText() et que vous utilisez à la place 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 (c'est bien sûr, sauf si vous le lui demandez :)).

2

Vous n'êtes pas spécifiquement énumérant les problèmes que vous devez surmonter. Un fichier peut être 100GB et vous pouvez avoir aucun problème à le traiter.

Si vous devez traiter le fichier dans son ensemble alors cela va nécessiter un certain codage créatif, mais si vous pouvez simplement traiter des sections du fichier à la fois, il est relativement facile de se déplacer à l'emplacement Dans le 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.

+0

Exactement ce que Casper a dit, sont aussi qu'ils enregistrements de longueur fixe ou de longueur variable et delimted par de nouvelles lignes? –

0

Quels sont les principaux problèmes que vous rencontrez en ce moment? La grande chose à retenir est de penser en termes de flux - c'est-à-dire de garder la quantité minimale de données en mémoire que vous pouvez. LINQ est excellent pour travailler avec des séquences (bien qu'il existe certaines opérations de tamponnage que vous devez éviter, telles que OrderBy).

Par exemple, here's une manière de gérer efficacement des enregistrements simples à partir d'un fichier volumineux (notez le bloc d'itération).

Pour effectuer plusieurs agrégats/analyse sur de grandes données à partir de fichiers, prendre en compte Push LINQ dans MiscUtil.

Pouvez-vous ajouter plus de contexte aux problèmes que vous envisagez?

0

Expansion de la réponse de JaredPar.

Si le fichier est un fichier binaire (c'est-à-dire stocké sous la forme de 4 octets, de chaînes de longueur fixe, etc.), vous pouvez utiliser la classe BinaryReader. Plus facile que de retirer n octets, puis d'essayer d'interroger cela.

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 retourner moins que cela, mais n'a pas encore atteint la fin du fichier.

La méthode BinaryReader.ReadBytes se bloque jusqu'à ce qu'elle lise le nombre d'octets demandé, ou Fin du fichier - qui vient en premier.

gars de collaboration de Nice :)

+0

Devrions-nous demander une fonction de réponse de groupe? – JaredPar

Questions connexes