Skrevet tor. d. 24. juli 2003 kl. 23:41:13| #1
Det hurtigste er sansynligvis at bruge fwrite til at gemme og fread til at læse.
Hvis du har dem i et array kan du gemme og læse dem alle i et kald til fread/fwrite.
Hvad mener du med "(tæt på int_64)"?
Skrevet tor. d. 24. juli 2003 kl. 23:55:08| #2
Efter som det ikke er mere end en måned siden jeg fik .net 2003 læste jeg jo lidt i manualerne.... Der står meget tydeligt at long long's og Int_64 ikke altid bliver behandlet ens :-)
Skrevet tor. d. 24. juli 2003 kl. 23:59:13| #3
Hvordan ser filen så enlig ud? - er det ligesom med "<<", med mellemrum mellem hver variabel, eller bliver det binært? - Kan du ikk oz lige skrive 1 hurtigt kode eksempel?
Skrevet fre. d. 25. juli 2003 kl. 00:23:07| #4
Det bliver en binær fil.
Skrive:
long long array[HUGE];
FILE *f = fopen("whatever.dat", "wb");
fwrite(array, sizeof(long long), HUGE, f);
fclose(f);
Læse:
FILE *f = fopen("whatever.dat", "rb");
fread(array, sizeof(long long), HUGE, f);
fclose(f);
Skrevet fre. d. 25. juli 2003 kl. 07:44:10| #5
Helt enig med Bertel.
Det er *meget meget* hurtigere at skrive og læse binære tal en at skulle
have dem skrevet og læst som tekst.
(og jeg ville også bruge gode gamle fwrite/fread til det)
Skrevet fre. d. 25. juli 2003 kl. 09:18:09| #6
Evt. kan du tilføje
setvbuf(f, NULL, _IOFBF, useVBuf);
efter fopen, useVBuf skal have en passende høj værdi, mindst allokerings enhed på harddisken, fx. 32768.
Skrevet fre. d. 25. juli 2003 kl. 13:21:46| #7
segmose >> til hvad nytte? skulle det gøre det hurtigere at gemme det? Skal gemme rigtig mange gange... det er et system hvor data'erne først bliver regnet ud i 10.000 array klumper og der efter så skal samles i én file.
Skrevet lør. d. 26. juli 2003 kl. 03:37:32| #8
bertelbrander >> smid så lige et svar på så jeg kan give dig point- Okay?
Skrevet lør. d. 26. juli 2003 kl. 13:59:41| #9
Jeg tror ikke det hjælper at bruge setvbuf.
Skrevet søn. d. 27. juli 2003 kl. 01:08:03| #10
Det kommer fuldstændigt an på det underlæggende OS og hardware, i nogle tilfælde giver det en betragtelig forbedring.
Skrevet søn. d. 27. juli 2003 kl. 02:11:36| #11
bertelbrander >> Okay sad lige og prøvede det.... og se så hvad .net debuggeren sagde om denne linie:
FILE *fprime("cache.pcf", "wb");
Debugger: "error C2078: too many initializers" &
"error C2440: 'initializing' : cannot convert from 'const char [3]' to 'FILE *'"
hvad gør jeg galt? (Har #include <cstdlib>)
Skrevet søn. d. 27. juli 2003 kl. 02:13:30| #12
Agrhh... så det lige da jeg trykkede udfør: Mangler 'fopen' foran '(' !!!
Lidt newbie har man vel også lov til at være :-)
Skrevet søn. d. 27. juli 2003 kl. 02:19:45| #13
Nå så tro man lige det vil virke men næ nej.... se her:
fread(baseprimes, sizeof(long long), BASE, fbaseprimes);
Giver : "error C2059: syntax error : ')'" + to mere med et manglende '+' og ')'.
Det den ikke tåle mellemrummet i "long long"? - Nej vel?
Skrevet søn. d. 27. juli 2003 kl. 09:40:41| #14
Umiddelbar set den linie OK ud.
Kan du poste linierne ovenover ?
Skrevet søn. d. 27. juli 2003 kl. 23:14:22| #15
cout << endl << "Loading baseprimes..." << endl;
if (fbaseprimes)
{
fread(baseprimes, sizeof(long long), BASE, fbaseprimes);
count+= BASE;
}
Skrevet søn. d. 27. juli 2003 kl. 23:27:07| #16
der kom også denne med så jeg lige:
error C2661: 'fread' : no overloaded function takes 3 arguments
/Z_B
Skrevet man. d. 28. juli 2003 kl. 00:08:45| #17
Hvordan er baseprimes, BASE og fbaseprimes erklæret?
Jeg kan ikke se at fread kun får 3 argumenter, medmindre du har en underlig erklæring af en af ovennævnte.
Skrevet man. d. 28. juli 2003 kl. 07:09:16| #18
Har du inkluderet stdio.h (eller cstdio) ?
Skrevet tir. d. 29. juli 2003 kl. 20:06:34| #19
#define BASE 1000000
long long baseprimes[BASE];
FILE *fbaseprimes("file navn", "rb");
Skrevet tir. d. 29. juli 2003 kl. 20:13:52| #20
Det går vist ikke.
FILE er en C ting ikke en C++ ting.
#define BASE 1000000
long long baseprimes[BASE];
FILE *fbaseprimes = fopen("file navn", "rb");
Skrevet man. d. 18. august 2003 kl. 23:52:25| #21
needs>
Er du kommet videre ?
Skrevet fre. d. 14. november 2003 kl. 22:22:53| #22
bertelbrander >> ved du noget om hvorfor der er en grænse på et sted mellem 100001 og 200K for hvor mange variabler man kan skrive til HD'en i ét array?
Skrevet fre. d. 14. november 2003 kl. 22:39:11| #23
Det er vel kun naturligt at der er en øvre grænse, jeg har endnu ikke set en komputer med uendelig meget HD/RAM ;-)
Grænsen er afhængig af kompiler og platform, jeg vil tro at standarden garanterer enten 32k eller 64k.
Jeg vil dog forvente at moderne kompilere kan håndtere langt over 100 MBytes.
Så fejlen kan også ligge et andet sted.
Hvilken kompiler/platform bruger du?
Skrevet fre. d. 14. november 2003 kl. 22:43:31| #24
bruger .net 2003 (windows xp home, på en centrino 1.4 med 512MB RAM). Det skulle da ikk ha' noget med com'en at gøre...?
Skrevet fre. d. 14. november 2003 kl. 23:11:41| #25
Jeg lavede lige et testprogram:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 32*1024*1024 /* 32MByte */
char Ar1[SIZE];
char Ar2[SIZE];
int main(void)
{
int i;
FILE *f;
for(i = 0; i < SIZE; i++)
Ar1[i] = rand();
f = fopen("text.dat", "wb");
printf("Writing\n");
if(fwrite(Ar1, 1, SIZE, f) != SIZE)
printf("Write Error!\n");
fclose(f);
f = fopen("text.dat", "rb");
printf("Reading\n");
if(fread(Ar2, 1, SIZE, f) != SIZE)
printf("Read Error!\n");
fclose(f);
printf("Comparing\n");
if(memcmp(Ar1, Ar2, SIZE))
printf("Compare Error!\n");
printf("Success, Hit Enter to exit\n");
getchar();
return 0;
}
På min PC med 128MByte RAM kører det fint når det er er kompileret med VC++ 6.0 (og cygwin-gcc og BorlandC). Som du ser skriver og læser det 32Mbyte på en gang. VC++ nægter at kompilere hvis jeg sætter SIZE til 128MByte.
Skrevet fre. d. 14. november 2003 kl. 23:24:04| #26
I mit vsc++ .net 2003 vil den altså ikk... j bruger altså oz long long's / 64 bit variabler... det er nok det.
Skrevet fre. d. 14. november 2003 kl. 23:42:37| #27
Jeg lavede en ny version der læser/skriver 4*1024*1024 __int64'er, det kører uden problemer, så jeg tror du har en fejl et andet sted. (__int64 er et andet navn for long long.)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE (32*1024*1024/sizeof(__int64)) /* 32MByte */
__int64 Ar1[SIZE];
__int64 Ar2[SIZE];
int main(void)
{
int i;
FILE *f;
for(i = 0; i < SIZE; i++)
Ar1[i] = rand();
f = fopen("text.dat", "wb");
printf("Writing\n");
if(fwrite(Ar1, sizeof(__int64), SIZE, f) != SIZE)
printf("Write Error!\n");
fclose(f);
f = fopen("text.dat", "rb");
printf("Reading\n");
if(fread(Ar2, sizeof(__int64), SIZE, f) != SIZE)
printf("Read Error!\n");
fclose(f);
printf("Comparing\n");
if(memcmp(Ar1, Ar2, SIZE*sizeof(__int64)))
printf("Compare Error!\n");
printf("Success, Hit Enter to exit %d %d\n", SIZE, sizeof(__int64));
getchar();
return 0;
}