Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    [vb.net] gestione memoria diverso codice a 32 o 64 bit

    Il codice di sotto legge un file binario e lo spezza in n file più piccoli.
    Utilizza un Buffer di memoria.
    Lanciando il programma ho osservato da Gestione Attività di Windows, l'occupazione di memoria ed ho visto che l'andamento dell'uso della memoria rispetto al tempo è una specie di sinusoide orizzontale, ossia un picco di memoria ed un rilascio, fino alla fine. Questo a 32bit

    In un sistema a 64 bit con 8Gb di memoria, la memoria non viene rilasciata, ma viene occupata fino ad esaurire gli 8 G della RAM

    Mi sapete dire cosa sbaglio nel codice?

    Ciao

    codice:
    Using r As Stream = File.Open(NomeFileInput, FileMode.Open, FileAccess.Read), br As New BinaryReader(r)
        Dim NumeroRecord As Long = r.Length
        Dim RighePagina As Long = 100000000 '500000
        Dim Pagine As Integer = CInt(Math.Ceiling(CDbl(NumeroRecord) / CDbl(RighePagina)))
    
        For pagina As Integer = 1 To Pagine
            Dim inizio As Long = (pagina - 1) * RighePagina
            Dim length As Long = Math.Min(RighePagina, NumeroRecord - inizio)
            Dim fine As Long = inizio + length - 1
            Dim NomeFileOutput As String = String.Format("c:\tmp\filepart_{0:0000}.dat", pagina)
    
            Dim buffer As Byte() = br.ReadBytes(CInt(length))
    
            Using w As Stream = File.Open(NomeFileOutput, FileMode.Create, FileAccess.Write), bw As New BinaryWriter(w)
                bw.Write(buffer)
                'bw.Flush()
            End Using
        Next
    End Using
    Pietro

  2. #2
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,287
    Non penso sia il tuo problema, ma tutte quelle variabili dichiarale fuori dal ciclo For(solo le dim).

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Proverò appena possibile.
    Ciao
    Pietro

  4. #4
    Il problema potrebbe essere in

    Dim NomeFileOutput As String

    Io proverei con un:

    Dim NomeFileOutput As StringBuilder

    fuori dal For... Next. e poi in ogni ciclo azzerare e quindi ridefinire NomeFileOutput




  5. #5
    Un programma che fa un mestiere di quel genere non ha il diritto di "mangiare" più di qualche KB di memoria. Perché leggi e scrivi a blocchi delle dimensioni del file di destinazione? Stai sprecando una marea di memoria per niente, visto che non ti serve a nulla caricare così tanta roba in memoria in una volta.
    Usa un buffer di dimensioni fissate (16 KB va più che bene) e usa il metodo Read del BinaryReader per leggere di volta il pezzettino di file.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Un programma che fa un mestiere di quel genere non ha il diritto di "mangiare" più di qualche KB di memoria. Perché leggi e scrivi a blocchi delle dimensioni del file di destinazione? Stai sprecando una marea di memoria per niente, visto che non ti serve a nulla caricare così tanta roba in memoria in una volta.
    Usa un buffer di dimensioni fissate (16 KB va più che bene) e usa il metodo Read del BinaryReader per leggere di volta il pezzettino di file.
    Ecco, questo è proprio il suggerimento che cercavo.
    Ciao
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.