Newsgroup: it.comp.programmare.win32
Titolo: Copiare memoria (> 32 bit)

Vorrei scrivere del codice Win32 per gestire grossi file (> 2-4 GB).
Sto usando i file mappati in memoria; nessun problema per la dimensione 
dei file, dato che questa viene espressa nelle API Win32 come doppie 
DWORD: high e low.
...pero', volendo usare funzioni come CopyMemory(), credo ci siano 
problemi... Infatti, li' la dimensione in byte e' espressa da un SIZE_T, 
che credo sia a 32 bit, quindi non posso gestire "in un colpo solo" 
blocchi piu' grandi.
Esiste una qualche API per copiare blocchi di memoria che accetta 
dimensioni espresse a 64 bit (con due campi high dword e low dword)?
...oppure bisogna per forza copiare "a blocchi" da 32 bit?
(Quindi scriversi una propria CopyMemoryEx() allo scopo, che usa la 
CopyMemory() ?)
Thnx
Ciao,
Dan

 Dan
Di niente
Darkbyte
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

 fino a 2^32 byte (4GB).
D'accordo. Il punto era: se io voglio copiare un blocco di 6 GB, devo 
spezzarlo per forza, ad esempio, in 4 + 2 [GB] ? (...cosa che avevo 
pensato all'inizio, ma di cui chiedevo conferma, magari poteva esistere 
una specie di CopyMemoryEx... )
Ciao
Dan

 Dan
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello (A. Celentano).


 Dan
Ciao :)


 spezzarlo per forza, ad esempio, in 4 + 2 [GB] ? 
La domanda a monte č: come fai ad aver allocato un blocco di 6Gb?

 Forse forse hai fatto qualche errore di calcolo?
Probabilmente l'ha fatto. Oltrettutto vorrei sapere perché mai mettere in
memoria virtuale un file così grosso; è come dice Vincent Vega: può mai
aver allocato un blocco indirizzabile da 64 bit, quando le dimensioni
massime della memoria virtuale sono indirizzabili da 32 bit??? E quale
funzione avrebbe mai usato per allocare sto blocco? Una funzione che
accetta un parametro a 64 bit come dimensioni? Oppure l'operatore new con
un __int64? Oltrettutto si suppone che deve aver allocato ben DUE di
questi blocchi mastodontici, perché il secondo è quello di destinazione
della copia!!!
Per copiare files da oltre 4 giga (è già riposto in questi termini il
problema è più probabile) non c'è nessun problema ad utilizzare CopyFile,
o meglio, CopyFileEx, così può anche visualizzare il cursore di
avanzamento (dal momento che duplicare oltre 4 giga non è roba da 10
secondi).
Poi esisteva anche una funzione della shell, di cui purtroppo non ricordo
il nome, che oltre a copiare il file visualizzava anche il cursore di
avanzamento di windows con tanto di animazione del foglio che vola nella
cartella :)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Scusa ma hai tutta quella ram a disposizione? Cioč hai piů di 4GB di ram?
Certo che no :-)
Pero' nulla escludeva l'esistenza di una Copy che potesse copiare anche 
10 GB, usando ovviamente file di swap e memoria virtuale, ma cio' in 
maniera del tutto "trasparente" per il programmatore.
In ogni caso ho risolto, semplicemente usando una "granularita'" a 32 
bit, e copiando a piu' passate.
Ciao
Dan

 La domanda a monte č: come fai ad aver allocato un blocco di 6Gb?
Esistono i file mappati in memoria, la memoria virtuale...

 problema è più probabile) non c'è nessun problema ad utilizzare CopyFile,
Grazie, ma non mi interessa la copia integra di un file.
Dan

 Esistono i file mappati in memoria, la memoria virtuale...
Ovvero? E' una domanda interessata.

, 
vincen...@despammed.com
 
says...

...non capisco se la tua e' una "battuta"...
In ogni caso, se sei serio, puoi fare riferimento all'API 
CreateFileMapping(), la quale ti consente di specificare un "bloccone" a 
64 bit, dato che la size e' divisa in due campi a 32 bit:
- DWORD dwMaximumSizeHigh
- DWORD dwMaximumSizeLow
Poi ti crei delle "viste", usando MapViewOfFile(). Qui specifichi 
l'ampiezza della vista con un valore a 32 bit (dwNumberOfBytesToMap), 
pero' puoi scorrere il file "a 64 bit", dato che l'offset lo specifichi 
con una coppia di DWORD (dwFileOffsetHigh, dwFileOffsetLow).
Tutto cio' in Win2K/XP... sotto i vari Win9x/Me non so se queste 
funzioni funzionano :)
La MapViewOfFile() ti ritorna un indirizzo che puoi trattare come un 
normale puntatore in memoria.

 ...non capisco se la tua e' una "battuta"...
No, no, era seria. Non mi era chiara la tecnica.

 normale puntatore in memoria.
Con i sistemi operativi a 32 bit, si tratta di un puntatore a 32 bit.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 No, no, era seria. Non mi era chiara la tecnica.
OK :-) 
...sai com'e', su Usenet non ci si puo' guardare negli occhi per capire 
le "sfumature" ! :)

 Con i sistemi operativi a 32 bit, si tratta di un puntatore a 32 bit.
Il che e' coerente col fatto che la MapViewOfFile() prenda come campo 
size un valore a 32 bit.
In ogni caso, ripeto, poiche' l'offset e' espresso _a 64 bit_, uno puo' 
"visitare" anche zone di memoria piu' ampie, basta "spostare" la view, 
usando appunte l'offset a 64 bit.
...o sui sistemi Win32 c'e' un limite di 4 GB per file mappati in 
memoria??
Dan

Ragazzi, per utilizzare memoria sopra i 4 GB c'è bisogno di un sistema 
operativo a 64bit e di un processore a 64 bit.
I processori x86 attuali (tranne l'ultimo nato della AMD) indirizzano tutti 
a 32 bit. Quindi oltre ad esserci un limite software c'è un limite hardware.
In tutti i casi non è possibili installare più di 4GB di RAM su in PC a 32 
bit.
Se volete allocare più di 4GB dovete per forza passare a Linux o altro 
sistema operativo, dato che da quanto ne so WinXP 64bit ancora non è uscito. 
AUGURI!!!! ;-))
In tutti i casi copiare in memoria file anche di  "soli" 500MB non è certo 
una delle tecniche di programmazione più raffinate... siamo programmatori, 
non macellai!!!
Dario 

 
Semmai un PetaByte dovrebbe essere 10'4 TeraByte.
Ma qui infatti non sono 1024 TeraByte:
2^64 = 2^4 * 2^60 = 16 * 2^20 * 2^40 = 16 * M * TeraByte;
praticamente oltre 16 milioni di TeraByte: perň non ricordo la scala 
oltre il tera:
2^10 = Kilo
2^20 = Mega
2^30 = Giga
2^40 = Tera
2^50 = Peta ?
2^60 = Epta ?
Vabč googlando dovrei saperlo...
Ah ecco: 
http://www.comefunziona.net/articolo.asp?Ogg=BitsBytes&Pro=0
2^50 = Peta
2^60 = Exa
2^70 = Zetta
2^80 = Yotta
Quindi 2^64 sono 16 ExaByte... che sono comunque tantini, 
indipendentemente dal prefisso :)
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello (A. Celentano).


 non macellai!!!
Non conosci la memoria virtuale e i file mappati in memoria sotto Win32?
Dal canto mio, non mi sogno certo di copiare 500 MB in memoria _fisica_.
Inoltre credo che con Win32 si possa "simulare" piu' di 4 GB usando i 
file mappati in memoria, dato che si possono specificare offset a 64 
bit.
Riguardo Linux, per alcune cose andra' anche bene, ma come user-
friendlyness e qualita' del plug-and-play tende a 0 (l'altro giorno ho 
sbattutto per far riconoscere ad una SuSE 9 una scheda audio Sound 
Blaster, e non ci sono neanche riuscito - poi ho letto su PC 
Professionale che hanno avuto lo stesso problema... e parliamo di una 
_semplice banale_ scheda audio).
Se le cose migliroeranno, saro' felice per GNU/Linux :)
Dan


Non c'e' tale limite, ma c'e' il limite che siccome un puntatore a 32 
bit non puo' indirizzare piu' di 4 GB, non e' possibile usarlo per 
copiare piu' di 4 GB.
L'unica possibilita' e' fare un loop in cui ad ogni iterazione si chiama 
la MapViewOfFile() (per spostare la vista) e si usa il nuovo puntatore 
ottenuto.


 Dan
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).


 ottenuto.
E' proprio quello che ho fatto.

 classico del pinguino... 
Infatti, secondo me questa evoluzione sarebbe l'ideale!
"A ciascuno il suo" :)
In ogni caso, concordo con te che siamo OT.
Dal canto mio, poi, non ho intenzione di alimentare nessun flame, quindi 
chiudo qui il discorso :-)
Ciao
Dan

 friendlyness e qualita' del plug-and-play tende a 0
Intendiamoci, io uso (anche) linux per lavoro, ma non me ne può sbattere di 
meno di Linux!!
Non volevo dire che Linux è meglio di Windows o viceversa: questi discorsi 
di solito li fanno i ragazzini idioti che credono che aver installato un 
sistema operativo o un altro sia uno status-symbol.
Da canto mio il sistema operativo è semplicemente un qualcosa che mi da 
servizi di base per poter scrivere più agevolmente le applicazioni che il 
cliente chiede.
Dario

 [+ altre cavolate]
Il tuo post puzza di flame, quindi per quanto mi riguarda non merita 
risposta.