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 p>
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? P>
3 Réponses :
Vous pouvez utiliser L'interface pour écrire dans le fichier mappé semble être un niveau assez bas, vous devez donc construire vos propres abstractions ou travailler avec mmap code> 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é. p>
étrangers.ptr code>
et similaire. P>
@Jonathan: Êtes-vous sûr que cela ne fonctionnera pas? La documentation indique que le module utilise CreateFilemapping CODE> et
MAPViewOffile CODE>, 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 :)
Ce devrait être très utile pour vous. Vous pouvez utiliser readfile code> et
wrôlerfile code> 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. P>
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.
Vous ne devez pas le traiter comme un [double] code> ou
[flotteur] code> 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. P>
Vous devenez aussi important que Jon Skeet dans la communauté Haskell. Vous êtes upémenté juste pour poster. : p