PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tikz / PGF - Tex capacity



Steffen1187
19-12-2013, 13:44
Grüßt euch,

direkt mal eine kleine Entschuldigung vorne weg, ich habe ein Minimalbeispiel angehängt, allerdings überschreitet das entscheidende File die Grenze von 100kb... Es sollte denke ich aber auch so möglich sein, mein Problem zu verstehen.

Mein generelles Vorgehen: Plot in Matlab erstellen, mit matlab2tikz als .tikz exportieren, in TeX einbinden --> wunderschöne Plots. So weit, so gut. Zwei Probleme: a) langsam, b) oben genannte Fehlermeldung. An verschiedenen Stellen (z.B. http://tex.stackexchange.com/questions/7953/how-to-expand-texs-main-memory-size-pgfplots-memory-overload) habe ich den Hinweis gefunden, man solle das Ganze nach Extern verlagern über
\usetikzlibrary{external}, Referenzen auf die Legendeneinträge bekommt man z.B. so:
\pgfplotsset{invoke before crossref tikzpicture={\tikzexternaldisable},invoke after crossref tikzpicture={\tikzexternalenable}}
\newcommand{\legendref}[1]{\tikzexternaldisable\ref{#1}\tikzexternalenable} wieder hin. Im Minimalbeispiel alles ersichtlich. Funktioniert auch super insgesamt, allerdings löst das nicht mein Problem mit der oben ersichtlichen Fehlermeldung. "WirrWarr.tikz" im Anhang ist im Prinzip genau das gleiche wie wirrwarr_lite.tikz, nur dass ich 1000 mal so viele Punkte auf der x-Achse verwendet habe.

Ich habe bereits versucht meinen Compileraufruf sum
pdflatex --shell-escape -synctex=1 -interaction=nonstopmode %.tex--extra-mem-bot=10000000 zu erweitern, was aber an der Fehlermeldung nichts ändert.

Hat noch jemand einen Tip? Ich verwende MikTex mit TeXMaker auf Win2007

Grüße und Dankeschön schonmal
Steffen

u_fischer
19-12-2013, 16:37
Also wenn du externalisierst dann dürfte es nicht viel helfen --extra-mem-bot=10000000 beim Aufruf zu benutzen, weil die Hauptarbeit ja von einem anderen pdflatex-Lauf gemacht wird, der die Option nicht mitbekommt. Da musst du schon den Speichern in den ini-Dateien erweitern.

http://docs.miktex.org/2.9/manual/runtimeparams.html

Oder die Option in die Aufruf-Definition von tikz einbauen.

(Ungetestet, weil ich jetzt keine Zeit habe).

bobmalaria
19-12-2013, 19:46
hi,

deine beste option ist die externalize library nicht mit pdflatex laufen zu lassen.
das ist ein problem das ich auch schon x-mal hatte.

ich löse es indem ich nur für die bilder lualatex verwende. dazu lässt sich externalize einstellen


\tikzset{external/system call={lualatex
\tikzexternalcheckshellescape -halt-on-error -interaction=batchmode
-jobname "\image" "\texsource"}}

der vorteil: keine memory beschränkung.
der nachteil: dauert lange

für mich war es die praktischste lösung. ich habe spektren mit vielen tausend datenpunkten aber auch peaks die nur von wenigen punkten definiert werden. ich könnte kluge reduzierungsalgorithmen drüber laufen lassen, am einfachsten ist es aber die daten einfach komplett zu plotten.
das resultierende pdf ist annehmbar gross. ein 200+ seiten textmit x-bilder war so ca 23mb gross

Steffen1187
20-12-2013, 07:55
Guten Morgen,

erst einmal besten Dank euch beiden! Ulrike, deine Variante habe ich (noch) nicht ausprobiert.

Bob, zu deinem Vorschlag eine Frage. Wenn ich "nur" den Codeschnippsel von dir mit in die Präambel werfe, funktioniert es leider nicht. Ich habe es zu nächst mit dem bislang funktionierenden Dokument versucht, also ohne die zu große TikZ-figure. Im LogFile steht dann zum Beispiel "Here is how much of LuaTeX's memory you used:", die Umstellung auf Luatex scheint also irgendiwe zu funktionieren, es wird aus meiner ersten figure auch eine pdf erstellt. Diese kann ich aber z.B. mit Adobe auch nicht öffnen, Meldung:
"Beim Öffnen des Dokuments ist ein Fehler aufgetreten. Diese Datei ist beschädigt und kann nicht repariert werden.

Während dem Compilierlauf poppt kurz eine Fehlermeldung auf:

"Error PDF file is damaged - attempting to reconstruct xref table
Error couldn't find error dictionary
Error couldn't read xref table
Process exited with errors'

und in der Log:

"!pdfTeX error: pdflatex (file C:/Users/sdy7si/Documents/minimalbeispiel/tikz/mi
nimalbeispiel-figure0.pdf): xpdf: reading PDF image failed
==> Fatal error occurred, no output PDF file produced!"

Hierfür auch noch ein Tip? :)

Grüße

Steffen1187
20-12-2013, 10:48
Ok, Update


\listfiles
\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage[pdftex]{graphicx}
\usepackage[]{subfig}

\usepackage[]{epstopdf}
\epstopdfsetup{outdir=./}
\usepackage[]{pstool}
\usepackage[]{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}

\newcommand{\matlabfigure}{C:/Users/sdy7si/Documents/matlab_figs/}
\newlength\figurewidth
\setlength\figurewidth{.8\textwidth}

\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/]
\tikzset{external/system call={lualatex
\tikzexternalcheckshellescape -halt-on-error -interaction=batchmode
-jobname "\image" "\texsource"}}
\pgfplotsset{invoke before crossref tikzpicture={\tikzexternaldisable},invoke after crossref tikzpicture={\tikzexternalenable}}

\begin{document}
\begin{figure}
\centering
\subfloat[ne orangene 1]{\begin{tikzpicture}
\node [orange,scale=10] {1};
\end{tikzpicture}}
\hfill
\subfloat[und ne cyanfarbene 2]{\begin{tikzpicture}
\node [cyan,scale=10] {2};
\end{tikzpicture}}
\caption{lustige bunte zahlen}
\end{figure}
\end{document}

Der Code hier funktioniert 1a. Sprich das Problem muss irgendwie an meinem .tikz liegen. Die Frage ist nur wie ich es löse ;)

Grüße und danke noch mal!


EDIT:
Kommando zurück... aus irgend einem Grund wird jetzt wieder per TeX kompiliert und nicht mit LuaTex... Sprich wieder die "capacity bla bla" Meldung :confused:

bobmalaria
20-12-2013, 13:48
der code sieht im bezug auf die externalize fuktion gut aus.

was ich vergessen habe zu erwähnen, du musst pdflatex die option
--enable-write18
mitgeben damit pdflatex das externe programm lualatex aufrufen darf.

versuche das am besten erstmal in einem minimalbeispiel ohne die ganzen anderen pakete die du sonst lädst und mit einem ganz einfachen plot (damit es schnell geht).

bei mir funktioniert das zuverlässig mit grossen datenmengen.

gruss

Steffen1187
20-12-2013, 13:54
Servus,

ich habe -shell-escape drin, laut Ulrike in irgend nem anderen Thema kann MikTex sowohl damit als auch mit Write 18.

Mir ist nun Folgendes aufgefallen:

Das Gesamtdokument gibt mir in seiner .log eine Info, wie viel der TeX-memory genutzt wurde (Bsp: Here is how much of TeX's memory you used:
19734 strings out of 494045
446354 string characters out of 3145966
627368 words of memory out of 3000000 usw.)
Das soll so denke ich, auf LuaLaTex umgestellt ist ja nur für die externen Tikz dingsl.

Wird eine tikz erfolgreich umgewandelt in eine pdf kann ich der .log entnehmen, dass dort auch LuaTex verwendet wurde:

Here is how much of LuaTeX's memory you used:
20913 strings out of 495014
100000,1144653 words of node,token memory allocated
373 words of node memory still in use:
nodes

erhöhe ich die Datenmenge (in meinem aktuellen Beispiel habe ich in einem Diagramm einfach immer 10 beliebige Kurven untergebracht und jeweils ein Diagramm mit 1000, 2000, 3000, 4000... Punkten auf der X-Achse erstellt. Ab 3000 Punkten auf der X-Achse bekomme ich denn wieder die Fehlermeldung, dass die TeX Kapazität nicht ausreicht.

Irgendwie komisch, oder? Kann das an einer alten / älteren Version von einzelnen Packages liegen?

bobmalaria
20-12-2013, 19:34
also wenn der lauf richtig funktioniert, dann bekommst du für jede tikz-grafik
eine separate:

*.dep, *. dpth, *.log, *.md5, *.pdf und *.xml

datei.
ist das bei dir so?

nur damit wir über das gleiche reden, du rust nur pdflatex auf. lualatex rufst sich durch den code selbst auf, du musst also gar nichts weiter machen. also nicht lualatex manuell über das ganze dokument laufen lassen. das gehtdann natürlich.

gruss

Steffen1187
22-12-2013, 11:58
Genau so wie du sagst ist es
Ich benutze pdflatex und nur für die tikz luatex. In dem extra Ordner entstehen bei den erfolgreich umgewandelten plots je eine pdf und eben die anderen Dateien dazu. Aus den log files von den Grafiken hab ich die Info mit der luatex memory, aus der log des Gesamtdokuments die Info mit der Tex memory.

Magger
22-12-2013, 14:28
Hallo Steffen,

das ist zwar keine direkte Lösung für dein Problem, aber mir hat es oft geholfen, die Anzahl der zu druckenden Datenpunkte zu reduzieren. Dazu habe ich mir mal eine MATLAB-Funktion geschrieben, der man die Rohdaten und die Anzahl der gewünschten Anzahl von Punkten übergibt, und welche die die entsprechend reduzierten Daten zurückliefert. Zur Kompression werden innerhalb einer Schleife die markantesten Datenpunkte über einer Vergleich mit einer interpolierten Kurve herausgesucht.

Hier ist der Quelltext der MATLAB-Funktion:

% Funktion zum Komprimieren von "verrauschten" Messdaten für das Plotten
% mit TikZ/pgfplots

% Optionen:
% csv_data - Daten -> Matrix(N,Y)
% N - Anzahl der Punkte -> Skalar
% modus - Modus
% plot
% semilogx
% semilogy
% loglog
%
function csv_data_comp=compress_csv_data2(csv_data,N,modus)
% prüfen, ob modus gesetzt wurde, wenn nicht auf Standardwert setzen
if nargin<=2
modus='plot';
end

% Modus überprüfen
if strcmp(modus,'semilogx')
csv_data(:,1)=log(csv_data(:,1));
elseif strcmp(modus,'semilogy')
csv_data(:,2:end)=log(csv_data(:,2:end));
elseif strcmp(modus,'loglog')
csv_data=log(csv_data);
end

% ersten Wert übernehmen
csv_data_comp(1,:)=csv_data(1,:);

% letzten Wert übernehmen
csv_data_comp(2,:)=csv_data(end,:);

% Schleife über die Anzahl der Punkte
for n=3:N
% neuen Verlauf interpolieren
csv_data_int=interp1(csv_data_comp(:,1),csv_data_c omp(:,2:end),csv_data(:,1));

% neuen Wert hinzufügen
% diese Variante fuehrt bei glatten Funktionen zu Fehlern, da die
% Bedingung auf mehrere Werte gleichzeitig zutreffen kann
%csv_data_comp(n,:)=csv_data(max(abs(csv_data(:,2: end)-csv_data_int))==abs(csv_data(:,2:end)-csv_data_int),:);
% diese Variante ist robuster, weil stets nur ein Wert gefunden wird
csv_data_comp(n,:)=csv_data(find(max(abs(csv_data( :,2:end)-csv_data_int))==abs(csv_data(:,2:end)-csv_data_int),1,'first'),:);

% sortieren
csv_data_comp=sortrows(csv_data_comp);
end

% Modus überprüfen
if strcmp(modus,'semilogx')
csv_data_comp(:,1)=exp(csv_data_comp(:,1));
elseif strcmp(modus,'semilogy')
csv_data_comp(:,2:end)=exp(csv_data_comp(:,2:end)) ;
elseif strcmp(modus,'loglog')
csv_data_comp=exp(csv_data_comp);
end
end

Der folgende Code-Schnipsel verdeutlich, wie das ganze anzuwenden ist.


x=linspace(0,2*pi,1000)
y=sin(x)
plot(x,y)
csv_data=[x.',y.'];
csv_data_comp=compress_csv_data2(csv_data,100);
plot(csv_data(:,1),csv_data(:,2),csv_data_comp(:,1 ),csv_data_comp(:,2),'o')
pathname='../Bilder/';
filename='sinus';
save([pathname,filename,'.dat'],'csv_data_comp','-ascii');


Das ganze funktioniert auch sehr gut bei "verrauschten" Verläufen.

Die erhaltene csv-Datei kann man direkt mit addplot table plotten.