J'ai besoin de lire de petites séquences de données à partir d'un fichier de 3,7 Go. Les positions que j'ai besoin de lire sont non adjacentes, mais je peux commander les E/S afin que le fichier soit lu du début à la fin.Comment tirer parti de la mise en file d'attente du disque IO
Le fichier est stocké sur un SAN iSCSI qui doit être capable de gérer/optimiser les E/S en file d'attente. La question est, comment puis-je faire une demande en un coup de toutes les données/positions dont j'ai besoin en une seule fois? C'est possible? Je ne pense pas async IO est une option, car les lectures sont très petites (20-200 octets)
Actuellement le code ressemble à ceci:
using (var fileStream = new FileStream(dataStorePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
for (int i = 0; i < internalIds.Count();i++)
{
fileStream.Position = seekPositions[i].SeekPosition;
... = Serializer.DeserializeWithLengthPrefix<...>(fileStream, PrefixStyle.Base128);
}
...
}
Je cherche des moyens d'améliorer ce que je/O parce que j'obtiens des performances de lecture légèrement inférieures. Tous les temps de recherche de déplacement de la tête semblent être additionnés.
+1 pour comprendre la question. Je crois que c'est exactement ce qui se passe, au moment où la deuxième lecture doit être faite, les disques ont déjà filé, d'où la raison pour laquelle je cherche un moyen de faire la queue matérielle. – andreialecu
J'aurais pensé que Windows a géré la mise en file d'attente matérielle pour vous. Vous ne pouvez certainement pas obtenir médiévale avec le disque dur sur la base C#. Vous pouvez seulement dire "allez ici et lisez X octets". J'expérimenterais différents modèles d'accès avec plusieurs threads.Peut-être que ce serait plus rapide si 2 fils lisaient A et B, puis C et D; ou peut-être A et M, puis B et N. –
L'API ReadFileScatter semble prometteuse. Ajout d'un texte de présentation à ma réponse. –