Je veux copier un grand fichier basé sur un ram (situé dans/dev/shm direcotry) sur un disque local, est-il possible d'obtenir une copie efficace au lieu de lire un caractère par un ou créer un autre morceau de mémoire? Je ne peux utiliser que le langage C ici. Y at-il de toute façon que je peux mettre le fichier de mémoire directement sur le disque? Merci!Comment copier efficacement un fichier ram_base sur le disque
Répondre
/dev/shm est de la mémoire partagée, donc une façon de la copier serait de l'ouvrir en tant que mémoire partagée, mais franchement je ne pense pas que vous allez gagner quelque chose. Lors de l'écriture de votre fichier de mémoire sur le disque, le goulot d'étranglement sera le disque. Assurez-vous simplement d'écrire des données en gros morceaux, et ça devrait aller.
Vous pouvez simplement copier comme tout autre fichier:
cp /dev/shm/tmp ~/tmp
Ainsi, un moyen rapide, simple consiste à émettre une commande cp
via system()
.
-1 parce qu'il s'agit d'une solution peu performante et qu'elle utilise un programme externe (ce qui provoque divers problèmes en soi) via system() (qui exécute la commande en utilisant un shell, provoquant divers autres problèmes).L'implémentation d'une opération de copie identique en C ne nécessite que quelques lignes de code. – Tronic
D'accord avec Tronic. –
@Tronic - Assez juste; soin de poster du code? –
Je voudrais mmap()
les fichiers et faire memcpy()
entre eux.
Je doute que cela offre de bonnes performances non plus. Il fait toujours la copie sur le CPU, et dans les benchmarks MMAP a tendance à être plus lent pour l'accès linéaire que d'autres méthodes. – Tronic
Ceci ne force pas le processeur à toucher la mémoire. Si les données sont déjà définies et doivent juste être écrites, je pense que c'est une manière très directe d'accomplir la tâche. – Potatoswatter
'memcpy()' impliquera certainement le processeur touchant la mémoire. Il n'a aucune idée que la destination est un fichier mappé en mémoire. – caf
Vous pouvez essayer de voir si l'appel système splice
fonctionne pour cela. Je ne suis pas sûr que ce soit le cas, car il a quelques restrictions sur les types de fichiers avec lesquels il peut travailler, mais si cela fonctionne, vous l'appellerez plusieurs fois avec des demandes de taille de page mémoire (ou plusieurs pages multiples) jusqu'à la fin , et le noyau le manipulerait très efficacement.
Si cela ne fonctionne pas, vous devrez effectuer mmap ou faire du vieux read
/write
. La lecture et l'écriture dans des blocs de la taille d'une page mémoire rendent les choses beaucoup plus efficaces. Cela peut être encore plus efficace si vos tampons sont alignés sur la taille de la mémoire car cela ouvre la possibilité au noyau de simplement déplacer les données vers/depuis la mémoire de votre processus via la gestion de la mémoire plutôt que de copier les données.
La seule chose que vous pouvez faire est read() dans les blocs alignés en taille de page. Je suppose que vous devez garantir les données telles qu'elles sont écrites, ce qui signifie que vous devez ignorer les tampons via posix_fadvise() ou utiliser O_DIRECT (j'utilise généralement posix_fadvise(), mais O_DIRECT est approprié ici).
Dans ce cas, la vitesse d'écriture du support seul détermine la vitesse à laquelle cela se produira.
Si vous n'avez pas besoin de contourner les tampons, l'opération se terminera plus rapidement, mais il n'y a aucune garantie que les données seront réellement écrites en cas de redémarrage/panne de courant/etc. Puisque la source des données est En mémoire partagée, je devine (encore une fois) que vous voulez que l'écriture soit garantie. La seule chose que vous pouvez optimiser est combien de temps il faut à read() pour obtenir des données de la mémoire partagée dans votre propre espace d'adressage, quels morceaux alignés de taille de page vont s'améliorer.
Merci les gars pour l'aide! Je l'ai fait en mmap le fichier RAM et écris le bloc entier directement à la destination. memcopy n'a pas été utilisé car j'écris actuellement dans un système de fichiers parallèle (pvfs), qui ne supporte pas l'opération mmap.
- 1. Comment copier l'objet InMemoryUploadedFile sur le disque
- 2. Comment tester un fichier sur le disque?
- 3. Comment copier efficacement istringstream?
- 4. En Python + Pylônes, un moyen simple de copier le fichier téléchargé sur le disque
- 5. Extension Chrome: Comment enregistrer un fichier sur le disque
- 6. Comment enregistrer un fichier xml sur le disque?
- 7. un tableau de Restitution doubles dans un fichier sur le disque dur
- 8. programme unix simple copier le fichier automatiquement USB sur le disque dur
- 9. Comment POSTER un fichier sur un serveur REST sans écrire le fichier sur disque avec PHP?
- 10. Comment copier un fichier sur le serveur distant dans Lotusscript
- 11. Copier un fichier sur un lecteur réseau partagé
- 12. Comment copier, coller et afficher efficacement un dossier Wordpress entier?
- 13. Création de fichier sur le disque complet
- 14. Enregistrement d'un fichier WAV sur le disque
- 15. comment est un fichier représenté sur un disque
- 16. éviter d'enregistrer nouveau fichier sur le disque
- 17. Comment chercher/remplacer efficacement sur un grand fichier txt?
- 18. Comment identifier efficacement un fichier binaire
- 19. mmap écrit dans un fichier sur le disque (synchrone/asynchrone)
- 20. Comment vider efficacement un fichier Perl DBM?
- 21. Comment écrire un blob binaire sur le disque sur Informix
- 22. Comment copier efficacement des fichiers de HDFS vers S3
- 23. Comment afficher un tableau de doubles sur le disque dur?
- 24. Comment obtenir l'espace disque sur un serveur?
- 25. Comment stocker un NSDictionary sur le disque et le relire?
- 26. Comment écrire un fichier COM Structured Storage modifié sur le disque?
- 27. Script pour copier des fichiers sur CD et non sur disque dur dans un nouveau répertoire
- 28. Transmettre le fichier XML généré sans enregistrer sur le disque
- 29. copier le fichier PDF
- 30. Copier un fichier texte
Vous obtiendrez des performances beaucoup plus élevées si vous utilisez des blocs plus grands que juste un octet. La solution optimale serait de laisser le matériel le faire en utilisant DMA, mais malheureusement je ne sais pas si cela peut être fait sur Linue. – Tronic