Newsgroup: it.comp.lang.visual-basic
Titolo: info gestione memoria

Ciao a tutti.
E' da poco che lavoro con vb6, ed avrei bisogno di un consiglio.
Devo leggere da un file csv circa 5000 record, ogniuno di 90 campi.
dopo una settimana di sbattimento, sono arrivato alla seguente
conclusione:
'''''  START VB6 CODE  '''''''''''
'' main code
'' tralascio le dichiarazioni varie tranne per:
dim vaRecords() As Variant
    Open strLoadFile For Input As #iFileNum
'' Ccount č una funzione che mi conta semplicemente
'  il numero di campi.
'  Leggo il primo record
    Line Input #iFileNum, strBuffLine
    numFileds = Ccount(strBuffLine, strSeparator)
    Do While Not EOF(iFileNum)
 
        '' Alloco il nuovo spazio necessario
        ReDim Preserve vaRecords(loadFile)
        vaRecords(loadFile) = Split(strBuffLine, strSeparator)
...
 
        '' leggo il sucessivo.
        Line Input #iFileNum, strBuffLine
        numFileds = Ccount(strBuffLine, strSeparator)
...
 
        loadFile = loadFile + 1
        sSleep (5)
    Loop
'''' END VB6 CODE
il problema che facendo cosě (che mi risulta molto comodo x lavorare con
i dati poi), quando supero i 1000/1500 records impiego 20 secondo per
ogni singola istruzione.
come se per ogni istruzione si vada a rileggere l'area di memoria
vaRecords.
Pensavo lo facesse solo alla redim preserve, invece anche per
l'istruzione "loadFile = loadFile + 1" oppure "Loop"
impiega 20 secondi.
Non ho idea di come ottimizzare la memoria...
Non vorrei crearmi una struttura fissa, poichč al mutamento del
tracciato corrisponderebbe una modifica del codice.
La sleep non si vede neanche, la CPU si piazza al 100% e non molla piů.
In C si potevano usare i puntatori.. ci sono anche quě?
HELP ME PLEASE!!!!
Ringrazio tutti !!
Ciao
Luca
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Devo leggere da un file csv circa 5000 record, ogniuno di 90 campi.
CUT
Potresti caricare il tutto su un recordset creato adhoc (che potrai anche
non salvare).. comunque l'occupazione della memoria rimarrą alta ma almeno
verrą gestita meglio.
Saņuti

 In C si potevano usare i puntatori.. ci sono anche quě?
Ni... comunque un problema come il tuo si risolve con i metodi tradizionali.
termoPilucco

 termoPilucco
Mi spiace dirtelo ma anche allocando un numero di elementi
sufficentemente grande
a priori i rallentamenti sono vistosi dopo il 1500° record letto.
Mi si piazza la CPU al 100%...
Ho una macchina vecchia (un celeron 500 mi sembra su NT4, 255MB di ram)
Mi sembra più che suff, per leggere un cvs di 4Mb...
Comunque ti posto la mia funzione per intero qui sotto.
Ho commentato la sSleep, e la funzione Ccount.
strSeparator coincide con il separatore ;
prova con un file ascii con 4500 records e 80 campi x ogniuno.
vedrai la tua CPU schizzare dopo il 1500° record.
'' START VB6 CODE ''
'' return value:
'' 0 -> input file vuoto
'' <0 -> numero record con errore
'' >0 -> numero di record caricati
Public Function loadFile(strLoadFile As String, _
                            strSeparator As String, _
                            vaRecords() As Variant) As Long
 
    '' Apertura del file in input
    Dim strBuffLine As String
    Dim iFileNum As Integer
    iFileNum = FreeFile
    Open strLoadFile For Input As #iFileNum
    loadFile = 0
 
    '' Per ogni record letto !!
    Line Input #iFileNum, strBuffLine
    Dim numFileds As Integer
    Dim numOldFileds As Integer
'    numFileds = Ccount(strBuffLine, strSeparator)
    numOldFileds = numFileds = 78
    Do While Not EOF(iFileNum)
 
        '' Alloco il nuovo spazio necessario
        ReDim Preserve vaRecords(loadFile)
 
        '' ci scrivo il record
        vaRecords(loadFile) = Split(strBuffLine, strSeparator)
 
        If loadFile = 0 Then
            numOldFileds = numFileds
        End If
 
        If numFileds <> numOldFileds Then
            loadFile = -loadFile
            Exit Function
        End If
 
        '' leggo il sucessivo.
        Line Input #iFileNum, strBuffLine
'        numFileds = Ccount(strBuffLine, strSeparator)
        numFileds = 78
        loadFile = loadFile + 1
'        sSleep (5)
    Loop    
    Close #iFileNum
End Function
'' START VB6 CODE ''


 Mi sembra più che suff, per leggere un cvs di 4Mb...
Il mio era oltre 10MB.
Probabilmente usi altre funzioni che rallentano.
termoPilucco

 termoPilucco
Mi succede una cosa strana....
Se metto un break prima e dopo il ciclo effettivamente mi 
dura solo qualche secondo.
ma se provo a cliccare sulla variabile vaRecords, partono 
i 20 secondi.. come mai? se rilegge ogni volta il contenuto?
ciao e grazie :))


 ciao e grazie :))
termoPilucco

 termoPilucco
hai troppo ragione :D
ora è accettabile, impiego qualche secondo (circa 8)...
Ciao !!
