Seite 8 von 9

Re: Hashfunktion

Verfasst: Sa Jul 16, 2011 1:21 pm
von fat-lobyte
OS: Windows 7, 64 Bit
Compiler: Microsoft Visual Studio 2005

Code: Alles auswählen

largefile.exe "einegrossedatei.iso"
sizeof(int) = 4
sizeof(long int) = 4

Filesize appears to be 0 (0 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Und das gleiche mit Microsoft Visual Studio 2010, mit x64 Target

Re: Hashfunktion

Verfasst: Sa Jul 16, 2011 2:24 pm
von nufan
Zum Testen verwende ich eine ca. 11GB große VirtualBox Festplatte.

OS: Kubuntu 11.04 (2.6.38-10), 32 Bit
Compiler: gcc version 4.5.2
glibc: 2.13
Ausgabe:

Code: Alles auswählen

sizeof(int) = 4
sizeof(long int) = 4

fopen(): Value too large for defined data type

OS: Ubuntu 11.04 (muss noch eine Alpha/Beta sein, bin nicht ganz sicher) (2.6.38-7), 64 Bit
Compiler: gcc version 4.5.2
glibc: 2.13
Ausgabe:

Code: Alles auswählen

sizeof(int) = 4
sizeof(long int) = 8

Filesize appears to be 11917148672 (11 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Ich wollte das ganze auch auf meinem FreeBSD-Rechner (433 MHz, 64 MB RAM, 8GB HDD) testen, aber der stürzte beim Mounten meiner 500GB Platte immer ab... ^^

Re: Hashfunktion

Verfasst: Sa Jul 16, 2011 2:59 pm
von cloidnerux
Hab das ganze mal um den test von "long long int" erweitert.

Und mal so nebenbei: int ist ein "signed" datentyp, sprich 1 byte geht für das "-"-Zeichen Drauf.
unsigned int braucht das nicht und kann zahlen bis 2^32-1 speichern und nicht nur 2^31-1, was Dateigrößen bis 4GB ermöglicht.
Das Minus wird dementsprechend auch bei 8-Byte variablen sich ungünstig auswirken, da es eben auch wieder nur Zahlen bis 2^63-1 zulässt, was trotzdem noch ne ganze menge ist.

Ich habe getestet auf Ubuntu 11.04 64-Bit mit 4GB RAM und 2.6.39.1-candela.
g++: g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
glibc: 2.13
Datei wurde über

Code: Alles auswählen

dd if=/dev/zero of=testdata bs=6442450944 count=3
erzeugt.
Ausgabe:
./test testdata
sizeof(int) = 4
sizeof(long int) = 8
sizeof(long long int) = 8

Filesize appears to be 6442438656 (5 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Edit:
Unter Win 7 32 Bit 3GB ram bei einer 7Gb datei.
Compiler mingw-g++ 4.5.2
test.exe largeISO.iso
sizeof(int) = 4
sizeof(long int) = 4
sizeof(long long int) = 8

Filesize appears to be 0 (0 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Und mit Visual Studio 2008:
test largeISO.iso
sizeof(int) = 4
sizeof(long int) = 4
sizeof(long long int) = 8

Filesize appears to be 0 (0 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument

Re: Hashfunktion

Verfasst: Sa Jul 16, 2011 3:42 pm
von Bebu
System Linux 2.6.39 64bit
g++ 4.61
glibc 2.13
Hier ist meine Ausgabe:

Code: Alles auswählen

sizeof(int) = 4
sizeof(long int) = 8

Filesize appears to be 21305801767 (19 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument

Re: Hashfunktion

Verfasst: Sa Jul 16, 2011 9:13 pm
von fat-lobyte
cloidnerux hat geschrieben:Und mal so nebenbei: int ist ein "signed" datentyp, sprich 1 byte geht für das "-"-Zeichen Drauf.
unsigned int braucht das nicht und kann zahlen bis 2^32-1 speichern und nicht nur 2^31-1, was Dateigrößen bis 4GB ermöglicht.
Das Minus wird dementsprechend auch bei 8-Byte variablen sich ungünstig auswirken, da es eben auch wieder nur Zahlen bis 2^63-1 zulässt, was trotzdem noch ne ganze menge ist.
Das ist richtig. Hast du dir allerdings die Referenz von fseek() angekuckt? Die erwartet nämlich weder "size_t" noch "unsigned int" sondern eben genau "long int", und zwar signed. Das geht klar auf Unix 64 bit, aber auf Windows (sowohl 32 als auch 64 bit) ist das immer noch ein 32-Bit Datentyp.

Zum Rest:
Also was ich mit dem Testprogramm zeigen wollte ist, dass es auf jeden Fall nicht so einfach möglich ist, große Dateien zu öffnen, und zwar zumindest nicht Problemfrei.
Das heißt nicht, dass es unmöglich ist, aber ich schlage vor die Lösung dieses Problems erstmal zu vertagen, es gibt noch genug zu tun.

Wenn das öffnen fehlschlägt, kann man sowieso nix machen und wenn nicht, kann man ruhig bis 2 GB freaden() und Hashen - dann überprüft man eben nur die ersten 2 GB.

Re: Hashfunktion

Verfasst: So Jul 17, 2011 12:15 am
von fat-lobyte
Viel feedback zum Code in cloidnerux PN-Eingang.

Re: Hashfunktion

Verfasst: Mo Jul 18, 2011 1:43 pm
von cloidnerux
So, mal zum Thema der großen Dateien:
So wie ich das sehe, erlaubt boost(boost/filesystem/fstream.hpp) das laden von größeren Dateien.
Die bisherigen test bestätigen dies.
Müssten wir mal sehen ob wir darauf umsteigen, was uns viel arbeit ersparen würde.

Re: Hashfunktion

Verfasst: Mo Jul 18, 2011 6:16 pm
von Bebu
cloidnerux hat geschrieben:So, mal zum Thema der großen Dateien:
So wie ich das sehe, erlaubt boost(boost/filesystem/fstream.hpp) das laden von größeren Dateien.
Die bisherigen test bestätigen dies.
Müssten wir mal sehen ob wir darauf umsteigen, was uns viel arbeit ersparen würde.
Ist das nicht dann sowieso Bestandteil des neuen C++ Standards?

Re: Hashfunktion

Verfasst: Mo Jul 18, 2011 6:33 pm
von cloidnerux
Ist das nicht dann sowieso Bestandteil des neuen C++ Standards?
Nein, C++ Standard spezifiziert NUR die Sprache.
Die Ganzen streams sind in der Standard-Library und worüber ich rede ist boost.
Und soviel ich weiß, erlauben die momentanen C++-Streamfunktionen auch keine größeren werte als 2^31-1.
Bleibt also erstmal nur boost, wenn es dann das macht, was ich denke was es macht^^

Re: Hashfunktion

Verfasst: Di Jul 19, 2011 11:41 am
von Kerli
cloidnerux hat geschrieben:
Ist das nicht dann sowieso Bestandteil des neuen C++ Standards?
Nein, C++ Standard spezifiziert NUR die Sprache.
Naja, der C++ Standard spezifiziert sehr wohl die Standardbibliothek, sogar auf knapp mehr als der Hälfte der Seiten ;)
Boost Filesystem kommt allerdings nicht hinein...