Daten nach versenden freigeben



  • Guten Abend zusammen,

    ich habe ein Problem und zwar habe ich eine Anwendung die einem Kindprozess eine Datei sendet, die Datei wird gechunkt übertragen. D.h. immer in 1024 Byte blöcken zum beispiel (kann auch kb sein oder so.. is variabel).

    Da ich unter umständen manchmal bis zu 180 MByte Dateien versenden will habe ich das problem das der Ram mehr oder weniger vollläuft da ich für kurze zeit 360 MByte im speicher habe (wenn die Datei komplett übertragen ist). Dies möchte ich natürlich vermeiden und frage mich wie ich dies am besten bewerkstellige? habe mir schon gedacht das ich vllt die gesendeten 1024 Byte immer nach dem senden Frei gebe.
    Ist das möglich? Wenn ja wie?

    Ich verwende bis jetzt eine Arrayartige Struktur für die Nutzdaten die verwendet werden (um genau zu sein std::string.... -.-)

    Ihr würdet mir extrem weiterhelfen wenn ihr da was wüsstet 🙂

    Danke !


  • Mod

    Wie wäre es, immer die gleichen 1024 Bytes zu benutzen?

    Und wo wäre überhaupt das Problem, einen string frei zu geben? Der gibt sich doch schließlich automatisch selber frei, wenn seine Lebenszeit endet. Diese muss dann eben enden, wenn er nicht mehr gebraucht wird und nicht unnötig verlängert werden.



  • Bau den Code der die Daten versendet so um dass er statt eines void* + size_t ein "Reader" Interface nimmt.
    Und dann implementiere einen solchen "Reader" der die Daten z.B. bereits "in Stücken" vorhält und dann Stück für Stück freigibt wenn halt was freigegeben werden kann.
    Oder der die Daten on-demand aus nem File liest. Bzw. was auch immer dir passend erscheint.

    Der Datenversendecode liest dann Stück für Stück und der Reader gibt Stück für Stück frei (oder auch nicht, das obliegt dann ganz dem Reader), und zum Schluss gibt der Datenversendecode den Reader frei.

    Beispielsweise

    class ByteReader
    {
    public:
        virtual ~ByteReader() {}
        virtual size_t GetRemainingSize() const = 0; // Falls nicht nötig gerne auch weglassen
        virtual size_t TryRead(uint8_t* buffer, size_t bufferSize) = 0; // Nicht const, da ja der Lesezeiger verschoben wird
    };
    
    // ...
    
        void StartTransfer(std::unique_ptr<ByteReader> dataSource); // std::unique_ptr = ownership transfer
    

Anmelden zum Antworten