Übersicht: Nach einigen Tagen der Recherche konnte ich keine schnelle, effiziente Möglichkeit finden, einen Vektor in eine Datei zu schreiben/zu lesen. Die Mehrheit der Antworten, die ich gesehen habe, involviert jedes einzelne Element in die Datei hinein/heraus. Dies ist unglaublich zeitaufwändig, da die Anzahl der Elemente zunimmt. Darüber hinaus konnte ich keinen Versuch auf eine Antwort zu meinem spezifischen Problem finden. Also, bitte, stellen Sie sicher, dass Ihre Lösung für meine spezifischen Umstand funktioniert (d. H. Lesen Sie die gesamte Frage).Effiziente Möglichkeit zum Lesen/Schreiben von Vektoren in Datei
Mein Problem: Ich habe eine sehr große Datenstruktur, die Pixelinformationen über Bilder enthält. Es gibt 60.000 Bilder mit jeweils 784 Pixeln. Jedes Bild ist ein Bild einer handschriftlichen Ziffer. Also muss ich zusätzlich zu den 60.000 * 784 Pixeln ein Label hinzufügen, damit ich weiß, welche Ziffer das Bild darstellt. Das Etikett, das ich benutze, was notwendig ist, wenn man es im Rahmen des gesamten Projekts betrachtet, ist ein Vektor mit 10 Möglichkeiten, die eine 0, 1, 2 ... 9 darstellen, von denen nur eine eine '1'/'enthält. wahr 'während der Rest' 0 '/' falsch 'ist. Darüber hinaus erfordert diese Datenstruktur aufgrund der Erfordernisse der linearen Algebra während des gesamten Rests des Projekts, dass die Information in einer "Col" -Struktur gespeichert wird, die in der Armadillo Linear Algebra Library verwendet wird. Also wird die Struktur, die ich in einer Datei speichern/einlesen möchte, als std::vector<std::vector<arma::Col<double>>>
deklariert.
Hier ist die Funktion, die ich jetzt die Daten speichern verwenden, Kontext zu geben:
void SaveTrainingData(vector<vector<Col<double>>> trainingData) //format: trainingData[60000][2][784, 10]
{
ofstream ofile("VectorizedTrainingData.dat", ios::binary);
for (int i = 0; i < trainingData.size(); i++)
for (int j = 0; j < trainingData[i].size(); j++)
for (int k = 0; k < trainingData[i][j].size(); k++)
ofile.write((char *)&trainingData[i][j][k], sizeof(double));
}
Wenn Sie Fragen haben, zögern Sie bitte nicht fragen! Danke im Voraus.
'void SaveTrainingData (Vektor >> Trainingsdaten)' Wenn Sie den Vektor nicht nach Wert übergeben, könnten die Dinge nur beim Funktionsaufruf beschleunigt werden. Führen Sie diese Option auch mit aktivierten Optimierungen oder einer "nicht optimierten" Debug-Version Ihres Programms aus? Beachten Sie außerdem, dass die Festplatten-E/A in einigen Punkten schwer zu optimieren ist, da ein großer Teil davon auf die Leistung der Festplatte zurückzuführen ist. –
PaulMcKenzie