Toutes mes excuses si cela a été traité ailleurs et ma recherche n'a pas trouvé. Mmap-vs-lecture-blocs est un problème similaire à ce que je suis en train de travailler, et a fourni un bon point de départ sur ce problème, avec les discussions en mmap-vs-lire.
J'ai une application Linux qui lit de 150 à 200 fichiers (4-10 GO) en parallèle. Chaque fichier est lu à son tour dans les petites, de façon variable de la taille des blocs, généralement moins de 2K chaque. J'ai actuellement besoin pour maintenir plus de 200 MO/s en lecture taux combiné de l'ensemble des fichiers. Les disques de gérer ce bien. Il y a une exigence prévue de plus de 1 GB/s (ce qui est en dehors du disque de parvenir à l'heure actuelle).
Nous avons mis en place deux différents de lecture des systèmes à la fois de faire un usage intensif de l' posix_advise
: la première est une mmap
ed lire en qui nous avons la carte de la totalité de l'ensemble de données et de lire sur demande.
Le second est un read()
/seek()
en fonction du système.
Les deux fonctionnent très bien, mais seulement pour les cas modérés, l' read()
méthode gère l'ensemble de notre fichier de cache beaucoup mieux et peut traiter ainsi avec 100s de GO de fichiers, mais il est mal limitée par la vitesse, mmap
est en mesure de pré-en cache les données de prise de durablement le débit de données de plus de 200 mo/s facile à entretenir, mais ne peut pas traiter avec un grand total de l'ensemble de données de tailles.
Donc ma question vient à celles-ci:
A: Pouvez - read()
type de fichier i/o sera encore optimisé au-delà de l' posix_advise
des appels sur Linux, ou d'avoir à l'écoute du disque planificateur, VMM et posix_advise appels est que aussi bon que nous pouvons nous attendre?
B: il y a des méthodes systématiques pour mmap pour mieux faire face à de très grandes données cartographiées?