2012-09-01 3 views
1

Je souhaite lire les lignes de plusieurs fichiers et non les lignes par ligne. Les fichiers ne tiennent pas en mémoire, je dois donc lire sur le disque. Quelle serait la meilleure façon de lire des lignes spécifiques à partir de plusieurs fichiers avec la meilleure performance?Lecture rapide de fichiers plus gros que la mémoire en c

Exemple:

  • Ligne 1 du fichier 4
  • ligne 5 du fichier 2
  • ligne 5 du fichier 4 .......
+1

Sur quel système d'exploitation? –

+0

La séquence dans laquelle les lignes sont sorties est-elle critique? La spécification nécessite-t-elle des lignes de chaque fichier en séquence (par exemple, la ligne de sortie suivante ne peut pas être «Ligne 1 du fichier 4»)? Vous avez probablement lu chaque fichier de manière séquentielle (en lisant éventuellement des fichiers différents en parallèle) pour trouver où se trouvent les fins de ligne. Je suppose qu'il n'y a aucune propriété pratique «toutes les lignes dans un fichier donné sont de la même longueur» qui peut être utilisé pour accélérer l'accès. –

Répondre

2

Sur Linux, vous pourrait lire et la mémoire mapper le fichier en morceaux multi-mégaoctets en utilisant le mmap(2) syscall, éventuellement avec madvise(2) et peut-être (dans un autre thread) readhahead(2) syscall.

Mais le goulot d'étranglement est probablement votre matériel. Pensez à utiliser SSD ou des disques très rapides. Si vous êtes intéressé par les limites de lignes, vous devez les gérer explicitement (et les mémoriser), en vous souvenant peut-être de quelques décalages de certains caractères de nouvelle ligne.

+2

En fait, 'mmap' est souvent plus petit que 'read' /' write' en raison de l'encombrement TLB. Ou, dans les mots d'un certain programmeur de noyau, [Oui, la mémoire est "lente", mais bon sang, ainsi est mmap] (http://lkml.indiana.edu/hypermail/linux/kernel/0802.0/1496.html) – Nemo

2

Si vous utilisez Linux ou Windows, vous pouvez créer un mappage de fichier du fichier. Cela ne sera pas mis en mémoire et vous donnera un accès rapide au tampon des fichiers.

Dans linux, vous pouvez vérifier l'homme pour "mmap".

Dans Windows je ne me souviens pas, mais vous pouvez google it: fichier de cartographie sur Windows. A propos de la lecture ligne par ligne, vous pouvez simplement utiliser fscanf ou implémenter votre propre fonction, rappelez-vous: lire jusqu'à "\ n" sous Linux, et "\ r \ n" dans Windows.

Bonne chance!

+0

Désolé, fscanf est seulement pour la lecture de fichier. Je voulais me référer à: sscanf. Aussi, ne perdez pas de vue pour mettre en œuvre votre propre fonction de lecture. Bonne chance! – user1189104

0

Vous ne savez pas quel système de fichiers vous utilisez, mais il ne sera sûrement pas capable de suivre automatiquement l'emplacement des sauts de ligne dans la mémoire réservée au fichier. C'est-à-dire que pour avoir un moyen d'accéder rapidement au fichier sur une ligne spécifique, vous devez construire un index des lignes, et s'il n'y a pas de propriété connue des fichiers avec lesquels vous traitez , vous devrez scanner les fichiers au moins une fois pour créer ces index. De toute évidence, si les fichiers sont plus grands que la RAM du système, vous aurez besoin d'implémenter une gestion de mémoire judicieuse lors de l'analyse nécessaire à la construction de votre index.

Une fois l'index créé, vous accéderez simplement à la seule section de la mémoire que vous voulez lire.

1

Votre problème ne lit pas le fichier. Votre problème est de savoir quelle partie du fichier lire.

Pour cela, vous devrez préparer à l'avance une table d'index avec la position du début de chaque ligne.

Vous pouvez, bien sûr, le construire de manière paresseuse, puis la ligne N est nécessaire.

Questions connexes