OVH Cloud OVH Cloud

limites de ReadFileEx ?

6 réponses
Avatar
Mickael Pointier
Bonjour.

Existe-il une limite à la taille des données que l'on peut charger de façon
asynchrone en utilisant ReadFileEx (sous Windows 2000 et XP) ?

Et si oui, est-ce documenté quelque part ?

Parce que la j'ai un gros problème, la fonction me retourne un code d'erreur
1450 (ERROR_NO_SYSTEM_RESOURCES), si j'essaye de charger plus de 64 megs
d'un seul coup.

Le CreateFile à été appellé avec pour paramètres:

=====================
lpFileName => nom du fichier à ouvrir
dwDesiredAccess => GENERIC_READ
dwShareMode => 0
lpSecurityAttributes => 0
dwCreationDisposition => OPEN_EXISTING
dwFlagsAndAttributes =>
FILE_FLAG_RANDOM_ACCESS|FILE_FLAG_OVERLAPPED|FILE_FLAG_NO_BUFFERING
hTemplateFile => 0
=====================

(que je mette RANDOM_ACCESS ou pas, le résultat est le même)

Ensuite au niveau du ReadFileEx, je passe ca:

=====================
OVERLAPPED overlapped;

overlapped.OffsetHigh = 0;
overlapped.Offset = 0;
overlapped.hEvent = file_handle;

if
(!ReadFileEx(handle,ptr_buffer,size_to_read,&overlapped,_FileIOCompletionRou
tine))
{
DWORD err=GetLastError();
return false;
}

// on attend
while (SomeFlagSettedByTheFileIOCompletionRoutine)
{
SleepEx(0,true);
}
=====================

Si le fichier fait moins de 64 megs, ca marche, si il fait plus de 64 meg,
j'ai l'erreur en question qui m'est retournée.

Si quelqu'un à une idée :(

Mike

6 réponses

Avatar
AG
Mickael Pointier wrote:

As-tu vérifié que :


An application must meet certain requirements when working with files
opened with FILE_FLAG_NO_BUFFERING:

File access must begin at byte offsets within the file that are integer
multiples of the volume's sector size. To determine a volume's sector
size, call the GetDiskFreeSpace function.

File access must be for numbers of bytes that are integer multiples of
the volume's sector size. For example, if the sector size is 512 bytes,
an application can request reads and writes of 512, 1024, or 2048 bytes,
but not of 335, 981, or 7171 bytes.

Buffer addresses for read and write operations must be sector aligned
(aligned on addresses in memory that are integer multiples of the
volume's sector size). One way to sector align buffers is to use the
VirtualAlloc function to allocate the buffers. This function allocates
memory that is aligned on addresses that are integer multiples of the
system's page size. Because both page and volume sector sizes are powers
of 2, memory aligned by multiples of the system's page size is also
aligned by multiples of the volume's sector size.
Avatar
Mickael Pointier
> Mickael Pointier wrote:

As-tu vérifié que :

An application must meet certain requirements when working with files
opened with FILE_FLAG_NO_BUFFERING:
[...]
of 2, memory aligned by multiples of the system's page size is also
aligned by multiples of the volume's sector size.



Oui, tout est bien alligné correctement.

Et de toute façon ca n'expliquerait pas pourquoi les fichiers de moins de 64
megs ne sont pas affectés.

D'ailleur le même example fonctionne sans aucun problème avec des fichiers
de 74, 92 et 145 megs sur mon kit de développement d'une console de jeu
microsoft tournant aussi sous environnement win32...

Je vais essayer de voir si le problème se produit aussi sous Windows 2000.

Mike
Avatar
Mickael Pointier
> > As-tu vérifié que :
>
> An application must meet certain requirements when working with files
> opened with FILE_FLAG_NO_BUFFERING:
> [...]
> of 2, memory aligned by multiples of the system's page size is also
> aligned by multiples of the volume's sector size.

Oui, tout est bien alligné correctement.

Et de toute façon ca n'expliquerait pas pourquoi les fichiers de moins de


64
megs ne sont pas affectés.

D'ailleur le même example fonctionne sans aucun problème avec des fichiers
de 74, 92 et 145 megs sur mon kit de développement d'une console de jeu
microsoft tournant aussi sous environnement win32...

Je vais essayer de voir si le problème se produit aussi sous Windows 2000.



Bon, ca fait la même chose sous Windows 2000.

Si je fait plusieurs appels à ReadFileEx, en saucissonant par blocs de 16,
20, 32 ou 63 megs, ca marche niquel. Dès que je dépasse 64 megs en une seule
fois ca foire.

J'ai googlé, rien trouvé :(

Mike
Avatar
AG
Mickael Pointier wrote:
As-tu vérifié que :

An application must meet certain requirements when working with files
opened with FILE_FLAG_NO_BUFFERING:
[...]
of 2, memory aligned by multiples of the system's page size is also
aligned by multiples of the volume's sector size.



Oui, tout est bien alligné correctement.

Et de toute façon ca n'expliquerait pas pourquoi les fichiers de moins de



64

megs ne sont pas affectés.

D'ailleur le même example fonctionne sans aucun problème avec des fichiers
de 74, 92 et 145 megs sur mon kit de développement d'une console de jeu
microsoft tournant aussi sous environnement win32...

Je vais essayer de voir si le problème se produit aussi sous Windows 2000.




Bon, ca fait la même chose sous Windows 2000.

Si je fait plusieurs appels à ReadFileEx, en saucissonant par blocs de 16,
20, 32 ou 63 megs, ca marche niquel. Dès que je dépasse 64 megs en une seule
fois ca foire.

J'ai googlé, rien trouvé :(

Mike




Je ne sais pas quelle est la taille de ton "volume's sector" mais as-tu
vérifié ça aussi :

File access must be for numbers of bytes that are integer multiples of
the volume's sector size
Avatar
Mickael Pointier
> Je ne sais pas quelle est la taille de ton "volume's sector" mais as-tu
vérifié ça aussi :

File access must be for numbers of bytes that are integer multiples of
the volume's sector size



Vivi, déja vérifié, mais comme je le disait dans un message précédent, ca ne
m'explique pas pourquoi ca marcherait pour les fichiers de moins de 64 megs
:(

Mike
Avatar
AG
Mickael Pointier wrote:
Je ne sais pas quelle est la taille de ton "volume's sector" mais as-tu
vérifié ça aussi :

File access must be for numbers of bytes that are integer multiples of
the volume's sector size




Vivi, déja vérifié, mais comme je le disait dans un message précédent, ca ne
m'explique pas pourquoi ca marcherait pour les fichiers de moins de 64 megs
:(

Mike




Dans les exemples de fichiers de moins de 64megs, tu aurais pu tomber
sur des tailles de fichier multiples, alors que pour 64 megs ça ne
serait justement pas multiple. Vu que je ne connait pas la taille de ton
"volume's sector", je ne peux pouvait pas t'en dire plus sur la validité
des autres tailles de fichier que tu as essayé (qu'elles soient plus
petites ou non).

D'ailleurs, tu devrais essayer une taille plus grande que 64 mega, pour
voir si c'est un problème de capacité ou simplement d'ajustement de la
taille.

Alexandre.