Autor Thema: Ist Lilypond auf die Generierung von x Seiten beschränkt?  (Gelesen 4575 mal)

Webfox

  • Member
Ist Lilypond auf die Generierung von x Seiten beschränkt?
« am: Dienstag, 19. Mai 2015, 15:56 »
Hallo,
ich habe zahlreiche Noten zu Übungszwecken erstellt.
Zum Teil sind das viele Seiten (über 30 pro Generierung). Je nach Notenbild streikt Lilypond mit einem Runtime Error oder stürzt einfach ab. Auch beim Versuch, statt .pdf png oder andere Formate zu erstellen. Daher meine Frage, ob Lilypond irgendwie eine Beschränkung oder ein Limit beim berechnen hat.

RobUr

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #1 am: Dienstag, 19. Mai 2015, 19:27 »
Zitat von: webfox
[…] ob Lilypond irgendwie eine Beschränkung oder ein Limit beim berechnen hat.
Nein.

Es wäre aber äußerst hilfreich für alle hier, die Lily aktiv mitentwickeln, wenn du deine eingesetzte Lily-Version angibst. Wenn du das Problem eingrenzen kannst, bekommst du sicher wertvolle Hinweise, ob es sich tatsächlich um einen Bug oder – der häufigste Fall – einen Eingabefehler handelt. In fast allen Fällen streikt Lily nur, wenn inkompatible Snippets zusammenkommen, aber auch das hat mit einer Limitierung nichts zu tun.

Übrigens ist es egal, welches Ausgabeformat man wählt: der Weg führt immer über Postscript, und bereits dort wird abgebrochen.

Gruß, Robert

fugenkomponist

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #2 am: Dienstag, 19. Mai 2015, 20:15 »
Bei einem sehr umfangreichen Projekt kann tatsächlich irgendwann der Arbeitsspeicher volllaufen (je nach Größe des Arbeitsspeichers natürlich). Allerdings eher bei so Sachen wie 150 Seiten großes Symphonieorchester oder so. Und das ist dann keine Beschränkung des Programms, sondern der Ressourcen ;)

harm6

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #3 am: Dienstag, 19. Mai 2015, 22:55 »
Ich hab zu Testzwecken schon 1000-Seiten pdfs generiert. Kein Problem.

Das Rechenintensivste Problem ist allerdings das spacing, genauer: die Berechnung der Zeilen- und Seitenumbrüche.

Setzt doch mal in ein problematisches file:
\paper { page-breaking = #ly:one-line-breaking }
Falls das durchläuft, liegt das Problem bei den Umbrüchen. Ich würde diese dann manuell setzen, via zweite Stimme, oä.

Falls es nicht durchläuft wird Roberts Szenario immer wahrscheinlicher.
Hierzu:
http://www.lilypond.org/doc/v2.19/Documentation/usage/troubleshooting


Gruß,
  Harm

P.S.
Übrigens ist es egal, welches Ausgabeformat man wählt: der Weg führt immer über Postscript, ...
Es gab allerdings bereits Überlegungen das zu ändern ...

Webfox

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #4 am: Dienstag, 19. Mai 2015, 23:56 »
Hallo,

hier mal ein Beispiel eines relativen komplexen Codes, den ich erstelle. Im Prinzip würden sich die Systeme immer bis zum nächsten Pagebreak wiederholen - mit wechselnden Handsätzen und Notenwerten.

\version "2.18.2"


%%#(set-default-paper-size "a4" 'landscape)

\header { tagline = ##f }


#(define drumset '(
    (bassdrum     default     #f        -3)
    (snare        default     #f         1)
    (hihat          cross     #f         5)
    (pedalhihat     cross     #f        -5)
    (closedhihat    cross     "stopped"  5)
    (openhihat      cross     "open"     5)
   
    (hightom      default     #f         3)
    (lowmidtom    default     #f         2)
    (lowtom       default     #f        -1)
   
    (ridecymbal     cross     #f         4)
    (crashcymbal    cross     #f         6)
    (cowbell           do     #f         3)))

\layout {
indent = #0
line-width = #160

  \context {
      \Score

    }
}


\paper {
 
fonts = #
(make-pango-font-tree
  "Calibri"
  "Calibri"
  "sans"
  (/ (* staff-height pt) 2.5))

print-page-number = ##f

%% Definition von Rändern und Abständen

#(define left-margin (* 3.5 cm))
#(define top-margin (* 1.5 cm))
#(define bottom-margin (* 1.5 cm))

  %% Abstände zwischen den Systemen & Verhindern eines weißen Randes am Seitenende
  system-system-spacing = #'((padding . 0.4) (basic-distance . 12))
  %%page-count = #10 (Seitenzahl kann erzwungen werden - optional)
  %%systems-per-page = #8 (Systeme pro Seite können erzwungen werden - optional)
  ragged-last-bottom = ##f
  ragged-bottom = ##f
 
}

\new DrumStaff
  \with {
    \consists "Parenthesis_engraver"
%    drumStyleTable = #(alist->hash-table drumset)
    instrumentName = #"1"
    \numericTimeSignature   
  }
  <<
  \new DrumVoice
    \with {
      \stemUp
      \override Script.direction = #UP
      \override Script.outside-staff-priority = #451
      \override TextScript.padding = 2
    }
    \drummode {
      \time 4/4
%---------------Hier beginnt der eigentliche Noten Code----------------------------------


\repeat volta2 {\repeat unfold 2 { <sn bd> 4^"R" <sn bd hhp> 4^"R" <sn bd> 4^"L" <sn bd hhp> 4^"R"}}
\repeat volta2 {\repeat unfold 2 { <tomh bd> 4^"R" <tomh bd hhp> 4^"R" <tomh bd> 4^"L" <tomh bd hhp> 4^"R"}}
\break
\repeat volta2 {\repeat unfold 2 { <tommh bd> 4^"R" <tommh bd hhp> 4^"R" <tommh bd> 4^"L" <tommh bd hhp> 4^"R"}}
\repeat volta2 {\repeat unfold 2 { <tomml bd> 4^"R" <tomml bd hhp> 4^"R" <tomml bd> 4^"L" <tomml bd hhp> 4^"R"}}
\break

\repeat volta2 {{ <sn bd> 4^"R" <sn bd hhp> 4^"R" <sn bd> 4^"L" <sn bd hhp> 4^"R"}}
\repeat volta2 {{ <tomh bd> 4^"R" <tomh bd hhp> 4^"R" <tomh bd> 4^"L" <tomh bd hhp> 4^"R"}}
\repeat volta2 {{ <tommh bd> 4^"R" <tommh bd hhp> 4^"R" <tommh bd> 4^"L" <tommh bd hhp> 4^"R"}}
\repeat volta2 {{ <tomml bd> 4^"R" <tomml bd hhp> 4^"R" <tomml bd> 4^"L" <tomml bd hhp> 4^"R"}}
\break

 {{ <sn bd> 4^"R" <sn bd hhp> 4^"R" <sn bd> 4^"L" <sn bd hhp> 4^"R"}}
 {{ <tomh bd> 4^"R" <tomh bd hhp> 4^"R" <tomh bd> 4^"L" <tomh bd hhp> 4^"R"}}
 {{ <tommh bd> 4^"R" <tommh bd hhp> 4^"R" <tommh bd> 4^"L" <tommh bd hhp> 4^"R"}}
 {{ <tomml bd> 4^"R" <tomml bd hhp> 4^"R" <tomml bd> 4^"L" <tomml bd hhp> 4^"R"}}
\break

\pageBreak

\repeat volta2 {\repeat unfold 2 { <sn bd> 8^"R" sn8^"R" <sn bd hhp> 8^"L" sn8^"R" <sn bd> 8^"R" sn8^"R" <sn bd hhp> 8^"L" sn8^"R"}}
\repeat volta2 {\repeat unfold 2 { <tomh bd> 8^"R" tomh8^"R" <tomh bd hhp> 8^"L" tomh8^"R" <tomh bd> 8^"R" tomh8^"R" <tomh bd hhp> 8^"L" tomh8^"R"}}
\break
\repeat volta2 {\repeat unfold 2 { <tommh bd> 8^"R" tommh8^"R" <tommh bd hhp> 8^"L" tommh8^"R" <tommh bd> 8^"R" tommh8^"R" <tommh bd hhp> 8^"L" tommh8^"R"}}
\repeat volta2 {\repeat unfold 2 { <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"L" tomml8^"R" <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"L" tomml8^"R"}}
\break

\repeat volta2 {{ <sn bd> 8^"R" sn8^"R" <sn bd hhp> 8^"L" sn8^"R" <sn bd> 8^"R" sn8^"R" <sn bd hhp> 8^"L" sn8^"R"}}
\repeat volta2 {{ <tomh bd> 8^"R" tomh8^"R" <tomh bd hhp> 8^"L" tomh8^"R" <tomh bd> 8^"R" tomh8^"R" <tomh bd hhp> 8^"L" tomh8^"R"}}
\repeat volta2 {{ <tommh bd> 8^"R" tommh8^"R" <tommh bd hhp> 8^"L" tommh8^"R" <tommh bd> 8^"R" tommh8^"R" <tommh bd hhp> 8^"L" tommh8^"R"}}
\repeat volta2 {{ <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"L" tomml8^"R" <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"L" tomml8^"R"}}
\break

 {{ <sn bd> 8^"R" sn8^"R" <sn bd hhp> 8^"L" sn8^"R" <sn bd> 8^"R" sn8^"R" <sn bd hhp> 8^"L" sn8^"R"}}
 {{ <tomh bd> 8^"R" tomh8^"R" <tomh bd hhp> 8^"L" tomh8^"R" <tomh bd> 8^"R" tomh8^"R" <tomh bd hhp> 8^"L" tomh8^"R"}}
 {{ <tommh bd> 8^"R" tommh8^"R" <tommh bd hhp> 8^"L" tommh8^"R" <tommh bd> 8^"R" tommh8^"R" <tommh bd hhp> 8^"L" tommh8^"R"}}
 {{ <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"L" tomml8^"R" <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"L" tomml8^"R"}}
\break

\pageBreak

}

%\new DrumVoice
%  \repeat unfold 6 { s1*2 \break}

>>

Möchte ich davon viele Seiten generieren, kommt in Frescobaldi die Fehlermeldung: Wurde mit dem Return-Code -1073741571 beendet.




harm6

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #5 am: Mittwoch, 20. Mai 2015, 01:39 »
Hallo,

ich habe Deinen Code so wie gepostet mit 2.18.2 kompiliert. Kein Problem.

Dann habe ich
\repeat unfold 100
\drummode { ... }
versucht.

Nach ein paar Minuten kam:
Zitat
terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc

Ich erinnere mich, daß das mit 2.18. öfter beklagt wurde.

Mit 2.19.20, der letzten devel-release, läuft der code aber fehlerfrei durch und generiert am Ende ein 200 Seiten pdf.
Auf meinem nicht allzu starken Laptop hat es allerdings ca 60 Minuten gedauert.
Mir ist nicht ganz klar warum es sooo lange gebraucht hat, denn in meinen Augen sieht Dein Code nicht so komplex aus.
Wenn man mal von all den überflüssigen Klammern absieht.
;)
Vielleicht wegen all der markups, da hat es auch mal ein Problem gegeben. Ich denk mal drüber nach ...

Und bitte, nicht mehr als 80 Anschläge pro Zeile. Manche Zeile paßt noch nicht mal zur Hälfte auf meinen Bildschirm...

Ich fürchte mehr fällt mir dazu nicht ein.


Gruß,
  Harm

Webfox

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #6 am: Mittwoch, 20. Mai 2015, 07:31 »
Hallo!

Vielen Dank für Eure Hinweise. Ich nutze einen i7 3770K mit 32 GB RAM. An der Rechenleistung liegt es daher wohl nicht. Je nach lLänge der .ly Datei und Notenwert (bei 4'tel Noten können mehr Seiten generiert werden, als bei 16'tel Noten) schwankt die möglichen Seitenzahl vor einer Fehlermeldung sehr. Mal 7, mal 20, höchstens 32 Seiten. Aber nie 40, 50 Seiten oder mehr.

Das ändert sich leider auch nicht bei Version 2.19.20.

mgd

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #7 am: Mittwoch, 20. Mai 2015, 08:46 »
Moin,

ich habe den Beispielcode inklusive des \repeat unfold 100
\drummode { ... }
auf meinem System mit der 2.19.20 laufen lassen. Das Notebook ist über 4 Jahre alt und die Produktion der 200 Seiten lief ohne erkennbare Probleme durch und dauerte insgesamt 2:52 Minuten.

Danach habe ich das Ganze auf einem anderen Rechner mit 2.18.2 wiederholt. Auch dort lief es ohne erkennbare Probleme durch und dauerte 2:39 Minuten.

Beide Rechner laufen unter Linux mit einem aktuellen Kernel. Außerdem sind beide Rechner großzügig mit RAM (16GB bzw. 64GB) ausgestattet.

@Webfox:
Wenn es dich interessiert wäre ich bereit dein crashendes Skript auf meinen System laufen zu lassen.

Liebe Grüße,
Michael

Webfox

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #8 am: Mittwoch, 20. Mai 2015, 12:00 »
Wahrscheinlich liegt es doch am Betriebssystem und am zur Verfügung stehenden Hauptspeicher.

Wir haben Folgendes festgestellt:
 
Bei einem Rechner mit Win 7, 32 Bit, mit 4 GB RAM schreibt Lilypond den Speicher wie folgt voll:

Seitenzahl - Speicherverbrauch
    6                        510 MB
    7                        540
    8                        610
    9                        680
    10                      860
    11                      940

Da ist natürlich schnell Schluss (auch bei meinem Rechner mit Win 8.1, 64 Bit und 32 GB RAM).

Und es sind immer maximal um die 7000 Noten. Wir haben verschiedene Beispiele durchlaufen lassen.

Wir haben festgestellt, dass die max. Seitenzahl je nach Notenwert immer gleich ist und immer um 7000 Noten max. beträgt. Bei 8' sind es z.B. 20 Seiten die generiert werden. Pro Zeile sind es 32 Noten, x12 Zeilen pro Seite x 20 Seiten = 7680 Noten.

Bleibt die Frage, warum das so ist.

@Michael: Ich sende Dir gerne einmal eine entsprechende Datei zu, wenngleich das Ganze systembedingt auf einem Linuxrechner ganz anders aussehen wird.




Webfox

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #9 am: Mittwoch, 20. Mai 2015, 22:08 »
Also es ist nun klar, dass es systembedingt ist. Ich installiere gerade Ubuntu neben Windows  ;)
« Letzte Änderung: Donnerstag, 21. Mai 2015, 07:41 von Webfox »

Webfox

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #10 am: Dienstag, 7. Juli 2015, 12:50 »
Hallo,

das Problem beschäftigt mich immer noch. Auch wenn es unter Linux nicht auftritt. Unter Windows bleiben diese Beschränkungen bestehen.

Gibt es irgendwo eine Erläuterung oder Referenz, wie Lilypond genau unter Windows 8.1 64 Bit den Speicher nutzt? Wie RAM, wie Auslagerungsdatei usw.?

Ist es möglich, die Generierung in mehrere Schritte aufzuteilen? Also z.B. Lilypoond anzuweisen, 5 Seiten zu generieren, dann den Speicher zu leeren (wie auch immer Lilypond unter Windows den RAM nutzt) und dann mit den nächsten 5 Seiten weiter zu machen bis alle Seiten der .ly Datei generiert sind? Die Teilergebnisse müssten z.B. in einer Temp zwischengespeichert werden.






mgd

  • Member
Re: Ist Lilypond auf die Generierung von x Seiten beschränkt?
« Antwort #11 am: Dienstag, 7. Juli 2015, 13:10 »
Ich kann dir hier leider nur Spekulationen liefern. Und weil ich genau darüber auch schon etwas länger nachgedacht habe, mache ich das auch einfach mal :)

Der Windows Lilypond Port wird mit mingw32 erstellt. Das ist ein inzwischen sehr in die Jahre gekommenes Produkt, das ausschließlich 32 bit Code erzeugt. Es könnte also sein, dass es einfach ein mingw32 Problem und nicht ein Lilypond Problem ist.

Ohne auf die Historie einzugehen (es gibt dazu Mengen an archivierten Posts in den zugehörigen Listen - bei Interesse verteile ich gerne Pointer) gibt es seit einigen Jahren einen Fork (mingw64), der 64 bit Code erzeugt und gleichzeitig erheblich aktiver weiter entwickelt wird. Um nun die These, es liegt an mingw32 zu prüfen, müsste man "nur" Lilypond mit mingw64 übersetzen und schauen, ob das Problem bestehen bleibt.

Ich will das seit einiger machen, habe aber noch keine Zeit gefunden.

Ich erwarte ferner, mittelfristig werden die regulären Lilypond Ports sowieso mit mingw64 erzeugt werden. Allerdings werden die Maintainer die erprobte mingw32 Buildumgebung nicht ohne echte Not austauschen.

Wie gesagt, alles reine Spekulation. Andererseits verwende ich aus ähnlichen Gründen seit einiger Zeit eben kein mingw32 mehr sondern bin auf mingw64 umgeschwenkt.

Liebe Grüße,
Michael