Frage
Ich habe ein sehr großes Bild (> 50.000² Pixel) mit kairo zu machen. Um dies zu tun, ohne Running Out of Memory I Teile des Bildes machen (<1.000² Pixel) eines nach dem anderen auf und verschmelzen sie später zusammen.
- Erstellen 1000x1000 Oberfläche
- Übersetzen in die Position des aktuellen Teils
- Zeichnen Bild (Aufruf der Zeichenanweisungen mit pycairo)
- Render / Save Bild in einer Datei (cairo_surface_write_to_png)
- Wiederholen Sie mit dem nächsten Teil
Da Cairos Clipping-Algorithmen ist schneller als meine eigenen, Schritt drei zieht das ganze Bild, auch wenn nur ein Teil davon sichtbar ist. Die meisten der CPU wird in Schritt 3 (durch Python) verwendet. Der größte Teil des Speichers wird in Schritt 4 (von kairo) verwendet wird.
Gibt es eine Möglichkeit, Dinge zu beschleunigen? So etwas wie das?
- Erstellen 1000x1000 Oberfläche
- Zeichnen Bild
- Bewegen Sie alles zur Position des aktuellen Teils
- Render / Save Bild in Datei
- Wiederholen 3 mit dem nächsten Teil
oder
- Erstellen 50000x50000 Oberfläche
- Zeichnen Bild
- Render / speichern nur den aktuellen Teil des Bildes in Datei
- Wiederholen 3 mit dem nächsten Teil
Lösung
Zu allererst mit C oder Vala statt Python wird wahrscheinlich die Dinge beschleunigen.
Wie für die Speichernutzung, würde ich meinen eigenen Strom versuchen zu schreiben, anstatt eine Datei (siehe write_to_png_stream ). Dieser könnte können Sie steuern, Speichernutzung (ich diese versuchen), unter der Annahme, Kairo Ihre Funktion nach getan alles nur einmal nicht nennen.