Als Teil unseres Installer-Builds müssen wir Tausende von großen Datendateien in etwa zehn oder zwanzig "Pakete" mit einigen Hundert (oder sogar Tausenden) Dateien zippen, die alle davon abhängig sind, dass sie mit den anderen Dateien aufbewahrt werden im Paket. (Sie werden zusammen versioniert, wenn Sie das tun.)Können Sie Datendateien, die zu einem späteren Zeitpunkt in eine Zip-Datei eingefügt werden sollen, vorkomprimieren, um die Leistung zu verbessern?
Dann wählt der Benutzer während der tatsächlichen Installation aus, welche Pakete in ihrem System enthalten sein sollen. Dadurch können sie auch Updates für die Pakete von unserer Site als eine große, versionierte Datei herunterladen, anstatt sie zu bitten, Tausende von Einzeldateien herunterzuladen, die dazu führen könnten, dass sie mit anderen im selben Paket nicht mehr synchron sind.
Da es sich um Datendateien handelt, ändern sich einige von ihnen regelmäßig während der Entwurfs- und Codierungsschritte, was bedeutet, dass wir alle Dateien in diesem bestimmten Zip-Paket erneut komprimieren müssen, auch wenn nur eine Datei geändert wurde. Das bedeutet, dass der Verpackungsschritt unseres Installers jedes Mal mehr als eine Stunde dauern muss, wobei die meisten davon dazu dienen, Dinge, die wir nicht berührt haben, wieder zu komprimieren.
Wir haben uns darum gekümmert, die Zip-Pakete allein zu lassen und dann bestimmte Dateien zu ersetzen, aber das Einfügen und Entfernen großer Dateien aus der Mitte einer Zip-Datei bringt uns nicht so viel Leistung. (Ein wenig, aber nicht genug, dass es es wert ist.)
Ich frage mich, ob es möglich ist, Dateien in einen zwischengespeicherten rohen "komprimierten Zustand" vorzuverarbeiten, der übereinstimmt, wie es in das Zip-Paket geschrieben würde, aber nur die Daten selbst, nicht die Zip-Header-Informationen, etc.
Mein Gedanke ist, wenn das möglich ist, während unseres Build-Schrittes würden wir zuerst nach jeder Datendatei suchen, die keinen komprimierten Cache damit verbunden hat und wenn nicht, würden wir diese Datei komprimieren und das Ergebnis in den Cache schreiben.
Als nächstes würden wir einfach alle Caches in einem Dateistrom zusammenfügen und jeden geeigneten Zip-Header hinzufügen, der für die Dateien benötigt wird.
Dies würde bedeuten, dass wir immer noch die gesamte Zip bei jedem Build neu erstellen, aber wir komprimieren nur Daten, die sich geändert haben. Der Rest würde nur so geschrieben werden, wie es ist, was sehr schnell ist, da es ein direktes Schreiben auf die Platte ist. Und wenn sich eine Datendatei ändert, wird ihr Cache zerstört, also wird der nächste Build-Pass neu erstellt.
Allerdings bin ich nicht sicher, dass so etwas möglich ist. Ist es, und wenn ja, gibt es irgendeine Dokumentation, um zu zeigen, wie man das versucht?
Gibt es einen Grund, warum Sie nicht jede Datei einzeln komprimieren können? Siehst du einen großen Dateigewinn, indem du sie alle in eine riesige Zip-Datei steckst? –
Versuchen Sie, [diese Frage SO] (http://stackoverflow.com/questions/1410533/deflate-compression-stream-where-pre-compressed-da-can-be-inserted-does-a-ne/1435813#) 1435813) – Icemanind
Zip-Dateien sind keine "festen Archive". Es sollte möglich sein. – usr