Oprettet tor. d. 24. juli 2003 kl. 23:33:13

needs
needs (19.788 point. Point ude: 0)

Vil gemme store Arrays af long long's

Okay... her er en af de svære....  hvordan gemme man hurtist 10.000 long long's (tæt på int_64) i en fil? (Bruger visual .net 2003)
Og så det naturlige følge spørgsmål: hvordan load'er man dem så ind igen? -bruger ">>", "<<" og en løkke lige nu.

Skrevet tor. d. 24. juli 2003 kl. 23:41:13| #1

bertelbrander
bertelbrander (17.270 point)
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

needs
needs (19.788 point)
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

needs
needs (19.788 point)
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

bertelbrander
bertelbrander (17.270 point)
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

arne_v
arne_v (1.016.169 point)
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

segmose
segmose (27.030 point)
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

needs
needs (19.788 point)
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

needs
needs (19.788 point)
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

bertelbrander
bertelbrander (17.270 point)
Jeg tror ikke det hjælper at bruge setvbuf.

Skrevet søn. d. 27. juli 2003 kl. 01:08:03| #10

segmose
segmose (27.030 point)
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

needs
needs (19.788 point)
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

needs
needs (19.788 point)
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

needs
needs (19.788 point)
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

arne_v
arne_v (1.016.169 point)
Umiddelbar set den linie OK ud.

Kan du poste linierne ovenover ?

Skrevet søn. d. 27. juli 2003 kl. 23:14:22| #15

needs
needs (19.788 point)
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

needs
needs (19.788 point)
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

bertelbrander
bertelbrander (17.270 point)
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

arne_v
arne_v (1.016.169 point)
Har du inkluderet stdio.h (eller cstdio) ?

Skrevet tir. d. 29. juli 2003 kl. 20:06:34| #19

needs
needs (19.788 point)
#define BASE 1000000
long long baseprimes[BASE];
FILE *fbaseprimes("file navn", "rb");

Skrevet tir. d. 29. juli 2003 kl. 20:13:52| #20

arne_v
arne_v (1.016.169 point)
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

arne_v
arne_v (1.016.169 point)
needs>

Er du kommet videre ?

Skrevet fre. d. 14. november 2003 kl. 22:22:53| #22

needs
needs (19.788 point)
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

bertelbrander
bertelbrander (17.270 point)
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

needs
needs (19.788 point)
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

bertelbrander
bertelbrander (17.270 point)
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

needs
needs (19.788 point)
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

bertelbrander
bertelbrander (17.270 point)
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;
}

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Updater Hybrid App

Oprettet den 18. april 2012 kl. 13.29
sir_madsen giver 100 point for svar | Giv et svar »

Ansi-c win32API - kan ikke oprette Richedit4.1 kontrol

Oprettet den 16. april 2012 kl. 22.13
cblcbl giver 60 point for svar | Giv et svar »

Iphone Objective C - Sætte image på et imageview.

Oprettet den 7. april 2012 kl. 11.36
lasserasch giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger