Quelle approche fonctionne le mieux pour lire rapidement des fichiers sur des disques optiques?

StackOverflow https://stackoverflow.com/questions/586727

  •  06-09-2019
  •  | 
  •  

Question

Lors de la lecture des fichiers hors d'un disque dur, mmap est généralement considéré comme un bon moyen d'obtenir rapidement des données en mémoire. Lorsque vous travaillez avec des lecteurs optiques, des accès plus de temps et vous avez un temps d'attente plus à se soucier. Quelle approche / abstraction utilisez-vous pour cacher / éliminer autant de latence et / ou le temps de charge globale du lecteur optique possible?

Était-ce utile?

La solution

Il n'y a pas abstraction réelle, vous pouvez employer. Les lecteurs optiques ont des caractéristiques très spécifiques qui doivent être optimisés pour obtenir les meilleures performances.

Quelques conseils:

Le plus grand tueur sur les disques optiques est temps de recherche. Lorsque cela est possible assurez-vous que tous les fichiers que vous lisez sont séquentiels sur le disque et aussi près que possible emballé. Si vous devez rechercher ensuite chercher dans une direction et le moins souvent possible.

La lecture asynchrone peut également améliorer massivement la performance. Si vous avez besoin de charger et de traiter les fichiers A, B & C, puis avant le traitement A, vous devriez commencer à lire le fichier B et B pendant le traitement, vous devriez lire le fichier C et ainsi de suite.

En général, plus les données que vous pouvez lire en une seule fois mieux, éviter beaucoup de par exemple peu lit (). Vous n'obtiendrez le débit théorique d'un disque en lisant de grandes quantités de données. Certains pilotes OS / pour minimiseront la peine de lire beaucoup de petits fichiers par des secteurs de mise en cache, d'autres non.

Faire beaucoup de exists (nom de fichier) vérification peut également être préjudiciable sur certains systèmes de fichiers / systèmes d'exploitation où seules parties de la table des matières sont mises en cache.

Dans nos applications nous emballons généralement des fichiers dans un ou plusieurs fichiers « » et ont lumped leur a ordonné de manière séquentielle en fonction de leur ordre d'accès. Certains fichiers (et répertoires) sont compressés et lus dans leur intégralité avant d'être décompressé en mémoire. Cela peut être une victoire si vous avez un répertoire qui contient une multitude de petits fichiers (XML ou scripts par exemple).

Fondamentalement beaucoup d'analyses comparatives et peaufinage:)

Autres conseils

Réduire ou éliminer les cherche en lisant des morceaux géants de données séquentiellement à partir de quelques fichiers (idéalement un).

D'abord, vous devez garder à l'esprit que les lecteurs optiques modernes sont la lecture très rapide des données séquentielles, mais la recherche de données est encore beaucoup plus lent que sur ZS. Donc, si vous devez chercher beaucoup dans un gros fichier (par exemple sauter au hasard autour dans un fichier 500+ Mo), il pourrait en fait être plus rapide d'abord copier l'ensemble de 500 Mo à HD (dans un fichier temporaire), ce qui sera fait dans séquentielle, des lectures rapides, effectuer l'opération sur le fichier temporaire (beaucoup plus rapide depuis les temps d'accès beaucoup plus rapide sur HD) et de supprimer à nouveau le fichier si vous avez fini avec elle.

La même chose vaut ci-dessus pour peu gros vs beaucoup de petits fichiers. Travailler avec un couple de gros fichiers est beaucoup plus rapide que de nombreux petits fichiers, car à chaque fois que vous passez d'un petit fichier à un autre l'énorme temps de recherche vous donnera des maux de tête à nouveau. Ceci est la raison pour laquelle de nombreux jeux navire sur supports optiques packs de données de jeu dans d'énormes fichiers d'archive (par exemple, toutes les textures d'un niveau sont dans un grand fichier au lieu d'avoir un petit fichier par la texture), essayez donc des données en gardant bien structurées dans les grands dossiers vous pouvez lire en séquentiel que possible.

cache HD lui-même est une bonne technique. Il y a ce jeu je me souviens, bien que j'ai oublié le titre, qui a toujours gardé les données 3D de votre environnement sur HD. Pendant que vous déplacez à travers le monde, il a été constamment copie des données de DVD HD. Ainsi, le paysage environnant 3D est toujours disponible sur HD pour un accès rapide, mais pas tout le DVD a été copié, seulement environ 200-300 Mo ont été temporairement mises en cache sur HD pour économiser l'espace HD. La seule chose ennuyeuse à ce sujet est que vous avez eu souvent accès DVD « bruit » tout en jouant le jeu, mais la plupart du temps, le processus se passait uniquement pendant les temps d'inactivité CPU, donc il n'a pas vraiment affecté le jeu. Seulement si vous avez exécuté très rapidement en permanence dans le même sens, il peut arriver que le lecteur de DVD reculait et tout d'un coup le jeu arrêté avec un indicateur de chargement pendant quelques secondes. Cependant je joue ce jeu pour les jours et peut-être vu cet indicateur de chargement à trois reprises dans une seule semaine. Si vous déplacez lentement ou pas constamment dans la même direction, il n'a jamais été un indicateur de chargement.

lents disques vont être lents. Pardon. Cependant, le matériel de lecteur optique sera normalement optimisé pour faire des lectures séquentielles, donc si vous pouvez faire votre travail de code de cette façon que vous pourriez voir une certaine amélioration. Je doute que vous verrez beaucoup de différence entre mmap(), fread(), et al, pour un accès séquentiel. Vous pourriez également être en mesure de régler votre lecture la taille du tampon à un multiple de la taille de bloc du lecteur, si votre système d'exploitation ne fait pas déjà pour vous. lecteur optique peut avoir de grandes tailles de bloc par rapport aux disques durs, et si vos tampons ne sont pas assez grand vous payez un prix.

Je ne suis pas sûr qu'il ya beaucoup de choses que vous pouvez faire au moment où vous lisez. Vous pouvez regarder l'API fichier créer - vous pouvez passer quelques conseils pour Windows qui lui dire que vous ouvrez le fichier pour un accès séquentiel ou aléatoire. Cela est censé permettre à Windows d'optimiser la stratégie de mise en cache utilisée pour le fichier.

Vous pouvez régler les « morceaux » que vous mordre lors de la lecture de votre fichier pour les rendre plus ou moins. Vous pouvez obtenir une légère amélioration si vous lisez en morceaux qui sont des multiples de la taille de l'unité d'allocation sur le disque.

Le matériel et les médias peuvent faire une différence. Disons que vous avez un lecteur de DVD qui lit à 16x. Il exigera des médias qui est évalué à 16x ou plus, et certains lecteurs ne fonctionnent pas bien avec certaines marques de médias. Ainsi, même si les médias répond aux évaluations, vous pourriez ne pas être la lecture à la vitesse maximale. (Généralement une bonne revue de matériel sur un lecteur optique inclura des détails comme celui-ci).

La mise en page des fichiers sur le disque optique pourrait être important. Est-ce brûlé tout à la fois? Est-ce monté comme un disque (comme un mode paquet R / W?). Je n'ai pas d'expérience avec cela, mais étant donné le temps de recherche plus sur un lecteur optique, les fichiers fragmentés pourraient avoir un impact plus important que ce qu'ils font avec un disque dur moderne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top