Ich muss kleine Datensequenzen aus einer 3,7-GB-Datei lesen. Die Positionen, die ich lesen muss, sind nicht neben, aber ich kann die IO bestellen, so dass die Datei von Anfang bis Ende gelesen wird.So nutzen Sie die Disk IO-Warteschlangenfunktion
Die Datei wird auf einem iSCSI-SAN gespeichert, der in der Lage sein sollte, in der Warteschlange befindliche E/A zu verarbeiten/zu optimieren.
Die Frage ist, wie kann ich eine One-Shot-Anfrage von allen Daten/Positionen machen, die ich auf einmal brauche? Ist es möglich? Ich glaube nicht, async IO ist eine Option, da die liest sind sehr klein (20-200 Bytes)
Zur Zeit der Code sieht wie folgt aus:
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);
}
...
}
Ich bin auf der Suche nach Möglichkeiten, dieses Ich zu verbessern/O weil ich etwas unterdurchschnittliche Leseleistung bekomme. All die Suchzeiten, die sich aus dem Bewegen des Kopfes ergeben, scheinen sich zu addieren.
+1 für das Verständnis der Frage. Ich glaube, das ist genau das, was passiert ist, durch die Zeit, die zweite Lese getan werden muss, haben die Platten bereits gesponnene, also warum ich in eine Art und Weise bin auf der Suche Hardware-Warteschlangen zu tun. – andreialecu
Ich hätte gedacht, dass Windows Hardware-Warteschlangen für Sie behandelt. Mit der Festplatte auf Base C# kann man sicher nicht mittelalterlich werden. Sie können nur sagen "Geh hierher und lese X Bytes". Ich würde mit verschiedenen Zugriffsmustern mit mehreren Threads experimentieren.Vielleicht wäre es schneller, wenn 2 Threads A und B lesen, dann C und D; oder vielleicht A und M, dann B und N. –
Die ReadFileScatter API klingt vielversprechend. Ich habe meiner Antwort einen Klappentext hinzugefügt. –