windows - Læsning af store filer ved hjælp af Memory Mapped Files

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ser mange artikler, der tyder på ikke at kortlægge store filer som mmap-filer, så det virtuelle adresserum vil ikke blive taget udelukkende af mmap.


Hvordan ændres det med 64 bit proces, hvor adresserummet øges dramatisk?
Hvis jeg har brug for tilfældigt adgang til en fil, er der en grund til ikke at kortlægge hele filen på én gang? (dusinvis af GBs-fil)

Bedste reference


På 64bit, gå videre og kortlæg filen.


En ting at overveje, baseret på Linux-oplevelse: Hvis adgangen er virkelig tilfældig, og filen er meget større, end du kan forvente at cache i RAM (så chancerne for at ramme en side igen er slanke), kan det være værd at specificere MADV\_RANDOM for at forsøge at stoppe akkumuleringen af ​​hit filsider støt og uendeligt bytte andre faktisk nyttige ting ud. Ingen idé om, hvad Windows-tilsvarende API er. [2]

Andre referencer 1


Der er en grund til at tænke grundigt på at bruge hukommelsesmappede filer, selv på 64-bit platform (hvor den virtuelle adresse rumstørrelse ikke er et problem). Det er relateret til den (potentielle) fejlhåndtering.


Ved læsning af filen 'konventionelt' - indberettes en hvilken som helst I/O-fejl ved hjælp af den relevante funktionsgenvinding. Resten af ​​fejlhåndtering er op til dig.


OTOH, hvis fejlen opstår under den implicitte I/O (som følge af sidefejlen og forsøg på at indlæse den nødvendige fildel i den relevante hukommelsesside) - Fejlhåndteringsmekanismen afhænger af OS.


I Windows udføres fejlhåndtering via SEH - såkaldt 'struktureret undtagelseshåndtering'. Undtagelsen udbreder sig til brugerens tilstand (applikationens kode), hvor du har en chance for at håndtere det korrekt. Den korrekte håndtering kræver, at du kompilerer med de relevante undtagelseshåndteringsindstillinger i kompilatoren (for at sikre påkaldelsen af ​​destruktorerne, hvis det er relevant ).


Jeg ved ikke, hvordan fejlhåndtering udføres i unix/linux selv.


P. S. Jeg siger ikke bruger ikke hukommelseskortede filer. Jeg siger gør dette omhyggeligt

Andre referencer 2


En ting at være opmærksom på er, at hukommelseskortlægning kræver store sammenhængende klumper af (virtuel) hukommelse, når kortlægningen er oprettet; På et 32-bit system suger dette især fordi på et ladet system er det usandsynligt at få lange kørsler af sammenhængende ramme, og kortlægningen vil mislykkes. På et 64-bit system er det meget lettere, da den øvre grænse på 64-bit er ... enorm.


Hvis du kører kode i kontrollerede omgivelser (fx 64-bit servermiljøer, bygger du dig selv og ved, at du kører denne kode bare fint) Fortsæt og kortlæg hele filen og bare håndtere den.


Hvis du forsøger at skrive generel kode, der vil være i software, der kan køre på et vilkårligt antal konfigurationer, vil du holde fast i en mindre klumpet kortlægningsstrategi. For eksempel kan du kortlægge store filer til samlinger af 1 GB klumper og at have et abstraktionslag, der tager operationer som læs (forskydning) og konverterer dem til forskydningen i den højre del, inden de udføres.


Håber det hjælper.