Bevor ich beginne, sollten Sie diesen Code:C++ mehrere Objekte in eine Datei serialisiert und deserialisiert begrenzte Anzahl von ihnen
Ein Datentransferobjekt ObjectDTO
class ObjectDTO {
public:
int id;
string string1;
string string2;
string string3;
int code1;
vector<string> stringList1;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &archive, const unsigned int version) {
archive & id;
archive & string1;
archive & string2;
archive & string3;
archive & code1;
archive & stringList1;
}
Serialisierung
void OutputStreamService::writeReportsToFile(vector<ObjectDTO> objects, int filename){
ofstream outputFileStream(to_string(filename));
boost::archive::binary_oarchive outputArchive(outputFileStream);
outputArchive << objects;
}
Deserialisierung
vector<ObjectDTO> InputStreamService::readObjects() {
ifstream inputFileStream(to_string(fileNumber++));
boost::archive::binary_iarchive inputArchive(inputFileStream);
vector<ObjectDTO> objects;
inputArchive >> objects;
return objects;
}
Ich verwende Boost Serialization C++ librarys, um eine vector
von s zu serialisieren und es später wieder zu lesen.
nehme an i erzeugt 30GB zufälliger s und speicherte es auf die gleiche Datei
Wie ich einige von ihnen lesen kann nur erreicht Speicherlimit zu vermeiden?
Ich benutze Boost Serialisierung, weil es die einfache Weise war, die ich gefunden habe, um das erste Problem zu lösen, aber ich kann zu jeder anderen Annäherung wenn notwendig ändern!
Sie lesen die Datei offenbar auf einem anderen System als dort, wo Sie sie generieren? Haben Sie das Memory-Mapping in Betracht gezogen (Boost Interprocess 'managed_mapped_file' kommt Ihnen in den Sinn)? – sehe
@Sehe das ist nicht der Fall. Das Programm zeigt drei Optionen an: Erstellen und Speichern (zufällig generierte Daten), Suchen und Löschen. Jeder von ihnen muss mit vom Benutzer bereitgestellten Seitenumbrüchen (speichern Sie 1000 ObjectDTOs in 10 Dateien, suchen Sie 5 ObjectDTOs in einer Datei mit 1000). Das Hauptproblem hier ist, dass ich nicht die ganze Datei laden kann, um diese 5 ObjectDTOs zu erhalten, die ich im letzten Beispiel erwähnte ... weil in einigen Situationen die Datei größer sein kann als der Speicher, den Sie kennen? Ich werde trotzdem auf 'managed_mapped_file' schauen! –
Wie können Sie es serialisieren, wenn es zu groß ist, um in den Speicher zu passen. Wenn Sie es serialisieren können, können Sie auf der gleichen Maschine im Prinzip deserialise – sehe