10
votes

Traiter avec de grands fichiers à Haskell

J'ai un grand fichier (4+ gigs) de, disons simplement, 4 octets flottants. Je voudrais le traiter comme une liste, dans le sens où je voudrais pouvoir utiliser la carte, filtrer, plier, etc. Cependant, au lieu de produire une nouvelle liste avec la sortie, je voudrais écrire la sortie dans Le fichier et ne doivent donc pas avoir à charger une petite partie du fichier en mémoire. Vous pourriez dire que je quel type appelé mutabilitéfileliste

Quelqu'un a-t-il couru dans cette situation avant? Au lieu de réinventer la roue, je me demandais s'il y a une manière pirate de traiter avec cela?


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser mmap pour mapper le fichier en mémoire, puis le traiter. Il y a un Module MMAP qui promet lire et écrire des fichiers lamentais et peut même travailler avec des morceaux mappés paresseux de fichiers, mais je ne l'ai pas essayé.

L'interface pour écrire dans le fichier mappé semble être un niveau assez bas, vous devez donc construire vos propres abstractions ou travailler avec étrangers.ptr et similaire.


2 commentaires

@Jonathan: Êtes-vous sûr que cela ne fonctionnera pas? La documentation indique que le module utilise CreateFilemapping et MAPViewOffile , deux que 64bits de la taille de fichier / des paramètres de compensation de fichier, de sorte que l'appel de l'API devrait fonctionner pour des fichiers de toutes tailles (par exemple msdn.microsoft.com/en-us/ Bibliothèque / ... ). Est-ce que le module brise ensuite cette fonctionnalité?


@sth honnêtement je ne sais pas avec certitude. Je vais hors ce que j'ai lu le net. J'ai eu cette limitation d'un fil sur les fichiers mappés de mémoire sur ce site. Je n'ai rien vu sur MSDN qui spécifie des exigences de taille de chaque sens, mais je ne pense pas qu'un programme sera capable d'obtenir plus de 2 Go de mémoire, peu importe la façon dont vous le découpez. Je suis en quelque sorte ce que l'inverse, la mémoire mappée de fichier :)



9
votes

Ce devrait être très utile pour vous. Vous pouvez utiliser readfile et wrôlerfile pour ce que vous devez faire, et tout est fait paresseusement. Il ne conserve que des choses en mémoire alors qu'elles sont toujours utilisées, vous pouvez donc lire, traiter et écrire le fichier sans blesser votre ordinateur.


1 commentaires

Hmm, je n'ai pas réalisé que les valeurs seraient expulsées de la mémoire. D'accord, je vais donner ça un coup.



13
votes

Vous ne devez pas le traiter comme un [double] ou [flotteur] en mémoire. Ce que vous pourriez faire est d'utiliser l'un des types de matrices emballés de liste, tels que UVector / Vector / ... En compagnie de MMAPFile ou ReadFile pour tirer des morceaux du fichier à la fois et les traiter. Ou utilisez un type de matrice emballé paresseux, équivalent à des byters paresseux.


1 commentaires

Vous devenez aussi important que Jon Skeet dans la communauté Haskell. Vous êtes upémenté juste pour poster. : p