Je suis devant un morceau de code, qui copie un fichier sur un périphérique USB. La partie suivante est l'importance importante:
while((bytesRead = fread(buf, 1, 16*1024, m_hSource)) && !bAbort) {
// write to target
long bytesWritten = fwrite(buf, 1, bytesRead, m_hTarget);
m_lBytesCopied += bytesWritten;
3 Réponses :
Qu'en est-il de la lecture et des écritures qui se chevauchent? P>
Dans le code actuel, le temps total est Cela pourrait être presque la moitié du temps si la lecture et l'écriture prend plus ou moins au même moment. P>
Vous pouvez le faire avec deux threads ou avec io asynchrone. Malheureusement, les threads et ASYNC IO sont dépendants de la plate-forme, vous devrez donc consulter votre manuel système ou choisir des bibliothèques portables appropriées. P> TIME (lecture d'origine) + TIME (écrivez copie) code>, si vous lisez le premier bloc, alors en écrivant, commencez à lire le deuxième bloc, etc. Votre temps total serait max (heure (heure d'origine), heure (écriture de copie)) code> (plus le temps de lecture / écriture des premiers et derniers blocs qui ne seront pas pipeline). P>
Afaik, USB E / S est également surtout dépendant de la plate-forme, n'est-ce pas?
@ Andrécaron, je suppose oui si vous construisez un pilote, mais dans ce cas, je pense que c'est juste d'accéder au système de fichiers, vous pouvez donc fopen code> fichiers (et c'est standard).
SYSTEM () CODE> STRUT> Ce sera plus rapide. LI>
-
Le code vérifie également après chaque copietep si tous les octets sont écrits correctement, afin que cela puisse également ralentir le processus. P>
blockQuote>
Vous pouvez le vérifier en créant hachage fort> de gros morceau. Comme fractionnez le fichier dans des morceaux de 64 m. Puis faites correspondre les hachages de ces morceaux. Protocole BitTorrent a cette fonctionnalité. P> LI>
-
Si vous avez MMAP code> ou MapViewOffile code> disponible, cartographique le fichier d'abord strong>. Puis écrivez-le à USB. De cette façon une opération de lecture sera traitée par le noyau strong>. p> li>
- kerrek a juste commenté à propos de
memcpy code> sur mmap code>. memcpy code> avec 2 mmap code> ed fichier strong> semble super. li>
ol>
Notez également que, les systèmes d'exploitation les plus récents écrit sur USB Stick lorsqu'ils sont enlevés. Avant de supprimer, il suffit d'écraser les données dans un cache. Donc, la copie du système d'exploitation peut apparaître plus rapidement. P>
@Kerreksb +1. memcpy code> avec 2 MMAP code> ed fichier semble une excellente option. Mise à jour ma question.
J'irais simplement avec certaines fonctions spécifiques du système d'exploitation que, à coup sûr, faites-le plus rapidement que tout ce qui soit écrit uniquement avec des fonctions C / C ++. P>
pour Linux Ceci pourrait être Fonction SendFile . Pour Windows copyfile fera le travail. < / p>
Regardez ailleurs pour le goulot d'étranglement. Vous pouvez obtenir une petite amélioration de changer la taille du tampon, mais votre problème est probablement autre chose.
Eh bien, c'est la seule partie qui fait quelque chose avec ce problème particulier. Donc, cela ne peut être que le code.
Supprimer le chèque que les octets ont été écrits correctement. Si vous ne pouvez pas faire confiance à la première écriture, vous ne pouvez pas faire confiance aux tâches suivantes. Lisez votre utilisation pour la vérification. (Je suppose que vous vérifiez les byteswritten pour des erreurs.)
Le code posté a l'air bien en matière de performance. Y a-t-il quelque chose dans la partie du code que vous n'avez pas publié pouvant causer un problème?
Plutôt que de lire les données pour le vérifier, utilisez FSYNC ().
J'ai entendu dire que cela peut parfois aider à changer de taille et à compter les paramètres. Essayez d'utiliser
fwrite (buf, byteesread, 1, m_htarget) code> et voyez si cela aide. Notez que cela ne fonctionnera pas pour FREAD car si vous spécifiez la taille étant 1000, et il reste moins de 1000 octets à lire, la fonction échouera.Donc, peut-être que l'appareil est reconnu comme un périphérique USB 1.1. USB 1 est mort lent ..
Allez pour copier un fichier en utilisant la mémoire mappée I / O ... juste une suggestion!