Limite 2GB file

di il
10 risposte

Limite 2GB file

Allora, si sono pazzo, mi piace distruggere...

Scopo del programma sarebbe aprire un file, riscrivere l'header e salvarlo con un altro nome, quindi eleiminare il file originale.

Non funziona con file più grandi di 2GB anche se compilato a 64. Qualcuno mi spiega perchè?

Questa è bella... qui nell'editor, si può decidere la formattazione del tipo di linguaggio... e Delphi/Pascal non c'è!!

procedure TForm1.Button1Click(Sender: TObject);


var
     FileToRead, FileToWrite : TFileStream;
     Value:array of byte;
    
	   Size :integer;


begin
	FileToRead := TFileStream.Create('originale.dat', fmOpenRead);
        Size:= FileToRead.Size;
        setlength (Value, Size);
        FileToWrite := TFileStream.Create('nuovo.dat', fmOpenWrite or fmCreate);

        FileToRead.ReadBuffer(Value[0],Size);

        FileToRead.Free;

        value[0] := cardinal('E');
        value[1] := cardinal('f');
        value[2] := cardinal('f');
        value[3] := cardinal('e');
        value[4] := cardinal('_');
        value[5] := cardinal('B');
        value[6] := cardinal('I');
        value[7] := cardinal('!');

    

        FileToWrite.WriteBuffer(Value[0],Size);

        FileToWrite.Free;

        deletefile ('originale.dat');
        label1.Caption :='ok';


end;

end.

10 Risposte

  • Re: Limite 2GB file

    A spanne, quanta RAM hai?

    Prima copia il file poi vai modificando il testo.

    Magari non ho compreso, oltre al senso, il codice.

  • Re: Limite 2GB file

    09/09/2025 - Franziscko ha scritto:

    Scopo del programma sarebbe aprire un file, riscrivere l'header e salvarlo con un altro nome, quindi eleiminare il file originale.

    Non funziona con file più grandi di 2GB anche se compilato a 64. Qualcuno mi spiega perchè?

    Stai caricando tutto il file in memoria, quindi esaurisci completamente la RAM: anche se i 64-bit ampliano lo spazio indirizzabile, la memoria non è comunque infinita.

    Dal punto di vista logico, non c'è nessuna utilità nel caricare completamente il file, soprattutto dato che devi modificarne sono l'header.

    Non devi caricare tutto, cambiare i byte e salvare tutto, bensì caricare un poco alla volta dal file di input e scrivere quei pochi byte alla volta nel file di output, modificando opportunamente quelle dell'header su cui devi agire. Tutti gli altri byte invece li scrivi esattamente come sono (visto che non devono essere modificati, a quanto ho capito). In questo modo, puoi gestire virtualmente anche file di terabyte.

    Inoltre, "proteggi" meglio le risorse dei file aperti usando il costrutto try...finally per garantire la chiamata al metodo Free (vedi questo approfondimento).

  • Re: Limite 2GB file

    Oh chi si rivede!!!

    ho capito, ora devo vedere come fare... ho un Ryzen 5 3600 con 16gb di ram, pensavo (male, a questo punto) che potevo caricare anche dieci gb in memoria ma purtroppo non è così e le mie conoscenza sono limitatissime, l'ho già detto che no ho mai studioato niente di informatica? ho la teerza media e la matematica è il mio punto debolissimo, quasi inesistente!!

    quindi se carico in memoria 3gb, esaurisco completamente la ram che è 5 volte più grande? Questo mi piacerebbe capirlo...

    Il try..finally... l'ho sempre evitato, sai perchè? try vuol dire prova gisto? Beh.. ho sempre detto, che mi serve provare? lo devo fare ebasta!!!

    ok, non mi linciare...

  • Re: Limite 2GB file

    10/09/2025 - Franziscko ha scritto:

    ho un Ryzen 5 3600 con 16gb di ram, pensavo (male, a questo punto) che potevo caricare anche dieci gb in memoria

    Nella RAM non c'è solo il posto per i tuoi dati: ci deve stare il sistema operativo, i servizi, il tuo stesso programma.
    In ogni caso, è l'approccio a essere sbagliato: se anche avessi RAM a sufficienza, cosa succede se ti si presenta un file ancora più grande?

    10/09/2025 - Franziscko ha scritto:

    le mie conoscenza sono limitatissime, l'ho già detto che no ho mai studioato niente di informatica? ho la teerza media e la matematica è il mio punto debolissimo, quasi inesistente!!

    Non c'è nulla di male nel "non conoscere", c'è molto di onorevole nell'imparare, ma è illusorio pensare di fare le cose senza prima studiare.
    Senza studiare non mi metterei mai a fare operazioni a cuore aperto, ma per le mie conoscenze neanche a fare il meccanico: se decido di farlo così, di punto in bianco, senza studiare, non posso stupirmi poi se perdo pezzi lungo la strada.

    10/09/2025 - Franziscko ha scritto:

    quindi se carico in memoria 3gb, esaurisco completamente la ram che è 5 volte più grande? Questo mi piacerebbe capirlo...

    Come detto sopra, in RAM ci sono altre cose, in numero variabile, e il sistema operativo impone pure dei limiti a seconda della situazione.

    La cosa da capire qui, per qualcuno che voglia imparare nel senso vero della parola, è che dovendo leggere un file e riscriverlo con una manciata di byte cambiati, non ha alcun senso caricare un file di GB o anche solo di svariati MB in memoria, a prescindere. Questo è il punto.

    10/09/2025 - Franziscko ha scritto:

    Il try..finally... l'ho sempre evitato, sai perchè? try vuol dire prova gisto? Beh.. ho sempre detto, che mi serve provare? lo devo fare ebasta!!!

    ok, non mi linciare...

    Se è una battuta OK. :D
    Se è una cosa seria di certo non lincio nessuno, a prescindere, però mi faccio senz'altro un'idea. :)

  • Re: Limite 2GB file

    Bisogna capire che tipo di variabile stai usando.

    TFileStream alloca 2 GB massimi. Anche se tu hai 16 GB.

    Per capirci viene creato un contenitore con una dimensione ben precisa. Finché c'è capienza ok oltre non va. Es. Int ha meno capienza di longint. A prescindere dalla RAM.

  • Re: Limite 2GB file

    A parte il fatto che dovresti seguire le indicazioni di @Alka sul fatto che il file non deve essere caricato tutto in memoria ma gestito a blocchi, se operi con una architettura a 64 bit e compili a 64 bit  NON dovresti utilizzare un integer ma un Int64 per la Size

  • Re: Limite 2GB file

    10/09/2025 - sihsandrea ha scritto:

    TFileStream alloca 2 GB massimi. Anche se tu hai 16 GB.

    La classe TFileStream non alloca GB: si occupa solamente di gestire un handle sul file aperto (con le API di Windows) in modo da poter fare letture, scritture, spostamenti nel file.

    Come analogia, si potrebbe pensare a un registratore a cassette: puoi andare all'inizio, alla fine, spostarti a metà, leggere una porzione, scriverne un'altra dalla posizione corrente, ecc.

    Può gestire file molto più grandi di 2 GB, infatti la proprietà Size è un Int64, se non ricordo male.

    10/09/2025 - sihsandrea ha scritto:

    Per capirci viene creato un contenitore con una dimensione ben precisa. Finché c'è capienza ok oltre non va. Es. Int ha meno capienza di longint. A prescindere dalla RAM.

    Il contenitore viene creato nel momento in cui si prende la "size" così com'è, e tramite il FileStream si prova a caricare tutti questi dati in un buffer: ovvio che la memoria si esaurisce.

    Facendo una metafora, è come se tu dovessi impararti a memoria un intero dizionario di italiano per cercare poi la definizione e il significato di una parola.

    Oltre a non avere senso caricare tutti questi dati in generale, lo ha ancora meno in questo scenario, dove materialmente si sta riscrivendo un file sostanzialmente identico all'originale, alterando solamente alcuni byte specifici, ma il discorso si può ampliare a qualunque necessità anche più gravosa in cui - potenzialmente - possono presentarsi file di dimensioni considerevoli.

    11/09/2025 - oregon ha scritto:

    se operi con una architettura a 64 bit e compili a 64 bit  NON dovresti utilizzare un integer ma un Int64 per la Size

    Infatti in Delphi la dimensione viene gestita con Int64, come dici tu. E funziona pure con il compilatore 32-bit.

    Quello che non va fatto è usare quel valore per dimensionare un buffer di quelle dimensioni. :)

  • Re: Limite 2GB file

    11/09/2025 - Alka ha scritto:

    Infatti in Delphi la dimensione viene gestita con Int64, come dici tu. E funziona pure con il compilatore 32-bit.

    Ma lui ha usato un iteger e quello è comunque inteso a 32 bit

  • Re: Limite 2GB file

    11/09/2025 - oregon ha scritto:

    Ma lui ha usato un iteger e quello è comunque inteso a 32 bit

    Non mi ricordavo l'istruzione in questione. :)

    E questo aggiunge un ulteriore problema: si sta pure mettendo un valore a 64 bit dentro a una variabile a 32 bit. :-p

  • Re: Limite 2GB file

    Ok perr me si può chiudere

Devi accedere o registrarti per scrivere nel forum
10 risposte