Wieviele Bytes einlesen?



  • Hi,

    ich hab mir ein kleines Programm geschrieben, um große Dateien so ab 700MB zu verschlüsseln. Immo lese ich immer 1024 Bytes ein, verschlüssel sie, und schreib sie wieder in die Datei. Ist dieser Wert vernünftig, oder sollte ich höher gehen?



  • Ich hab gute Erfahrung mit 64k (0x10000 Byte lesen und schreiben) gemacht, geht sehr schnell!



  • wird eh alles vom OS nochmal gepuffert. nimm den groessten wert, bei dem du noch vollen durchsatz hast, also wo das massenspeichermedium noch konstant gefordert wird und nicht liest, aufs prog wartet, liest, aufs prog wartet (laesst sich mit systemeigenen mitteln messen).



  • Hab jetzt mal den Versuch mit 64k gemacht, aber im Sekundenbereich war kein unterschied feststellbar.



  • Wirst auch im 1MB Bereich keinen unterschied merken



  • windoofs?
    dann benutz' 'memory mapped files': http://msdn2.microsoft.com/en-us/library/aa366537.aspx
    ist auf jeden fall viel schneller als daten selber einlesen...
    🙂



  • Damit hatte ich es auch schon versucht, aber vermutlich weil ich bei CreateFileMapping für die Argumente dwMaximumSizeHigh und dwMaximumSizeLow bzw bei MapViewOfFile für dwNumberOfBytesToMap jeweils 0 eingegeben hatte stieg die Speicherauslastung immer weiter an un das Bearbeiten der Dateien verzögerte sich stark.

    Wo muss ich einstellen, dass jeweils nur i Bytes im Speicher gehalten werden und danach automatisch FlushViewOfFile für den gerade bearbeiteten Bereich aufgerufen wird?



  • bei 'MapViewOfFile' kannste 'nen offset angeben und wieviele bytes der datei ab diesem offset im speicher abgebildet werden sollen...



  • Gut, kann müsste ich aber auch wieder jeweils nach i Bytes Flush, Unmap, Map aufrufen. Ist das wirklich schneller wie wenn ich i Bytes lese, und wieder schreibe?



  • Toniiii schrieb:

    Gut, kann müsste ich aber auch wieder jeweils nach i Bytes Flush, Unmap, Map aufrufen. Ist das wirklich schneller wie wenn ich i Bytes lese, und wieder schreibe?

    ich denke ja.
    ich hatte mal sowas ähnliches gemacht, etwa 300MB messdaten von einer compact-flash karte in CSV umgewandelt und wieder abgespeichert. hab's auch erst konventionell gemacht, aber mit 'filemapping' ging's etwa doppelt so schnell.
    ich hatte allerdings kein 'flush' benutzt (kann sein, dass dafür wartezeiten nötig sind?) sondern einfach nur map-unmap-map-unmap usw...
    ist schon etwas länger her, aber ich glaub' es waren immer 2 pages pro mapping (2*4096 bytes)...



  • zur information: windows xp's explorer.exe liest/schreibt immer 64 KiB


Log in to reply