<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich möchte eine große Menge Textdaten aus einem JMP-Skript ausgeben. Ich kann die Zeichenfolgenverkettung verwenden, um die Ausgabe aufzubauen, und sie dann mit dem Befehl „Textdatei speichern“ auf einmal schreiben. Dies ist jedoch sehr ineffizient und wird mit zunehmender Länge der Zeichenfolge undurchführbar.
Unterstützt JMP Dateistreams, mit denen ich die String-Ausgabe beim Erstellen direkt an einen Puffer weiterleiten kann?
Danke für den ausführlichen Ansatz. Die Kombination der Verwendung einer Liste zum Binning und der Verwendung von „Textdatei speichern“ mit „Anhängen“ ergibt eine gute Annäherung an einen Dateistream. Bei diesem Ansatz muss ich die Bin-Größe und die regelmäßigen Anhängevorgänge manuell codieren, aber wenn diese implementiert sind, ist die Leistung angemessen.
Eine andere Strategie, um die Verlangsamung sehr langer Zeichenfolgen zu umgehen: Erstellen Sie eine Liste kürzerer Zeichenfolgen und verwenden Sie ConcatItems(list), um sie zu einer einzigen Zeichenfolge zusammenzufügen.Geben Sie das benötigte Trennzeichen an, z. B. „“, wenn Sie kein Trennzeichen zwischen den Elementen hinzufügen möchten. Vor JMP 13 müssen Sie möglicherweise auch die Liste sorgfältig erstellen, wenn sie Tausende von Elementen enthält ... siehe Schnelle Liste. Dieses Beispiel zeigt den Build-it-in-Reverse-Ansatz.
Liste = {};
einfügen in(list, "line1", 1);
einfügen in(list, "line2", 1);
einfügen in(list, "line3", 1);
list = reverse(list);
ConcatItems( list, "\!n");
"Linie 1
Zeile 2
Zeile3"
Wenn Sie die Wahl haben, belassen Sie die Zeichenfolgen im Bereich von 10.000 bis 100.000 Zeichen.Zu kurz, und Sie werden (vielleicht) auf Probleme mit einer großen Anzahl von Listenelementen stoßen, von denen jedes seinen eigenen Overhead hat.Wenn sie zu lang ist, besteht immer noch das Problem der langsamen Verkettung (bei dem es sich um ein N^2-Problem handelt, sodass die Länge der Zeichenfolgen auf diese Weise verwaltet wird). Wirklich helfen).
Dennoch sind JSL-Strings auf 2^31 (2 GB) Zeichen beschränkt.Ich denke, Jims Append-Idee wird für mehr als 2 GB funktionieren.Sie möchten dennoch relativ große Blöcke an die Datei anhängen, da jedes Speichern + Anhängen einen Mehraufwand für das Öffnen/Schreiben/Schließen mit sich bringt.In diesem Beispiel werden 500.000.000 Zeichenblöcke geschrieben, bis die Festplatte voll ist.
txt = Repeat( "a", 5e8 );
Textdatei speichern( "$temp\deleteme.txt", txt, Mode( "replace" ) );
Show( File Size( "$temp\deleteme.txt" ) );
For( i = 1, i <= 20, i++,
Textdatei speichern( "$temp\deleteme.txt", txt, Mode( "append" ) );
Show( File Size( "$temp\deleteme.txt" ) );
);
Dateigröße("$temp\deleteme.txt") = 500000000;
Dateigröße("$temp\deleteme.txt") = 1000000000;
Dateigröße("$temp\deleteme.txt") = 1500000000;
Dateigröße("$temp\deleteme.txt") = 2000000000;
Dateigröße("$temp\deleteme.txt") = 2500000000;
Dateigröße("$temp\deleteme.txt") = 3000000000;
Dateigröße("$temp\deleteme.txt") = 3500000000;
Dateigröße("$temp\deleteme.txt") = 4000000000;
Dateigröße("$temp\deleteme.txt") = 4500000000;
Dateigröße("$temp\deleteme.txt") = 5000000000;
Dateigröße("$temp\deleteme.txt") = 5500000000;
Nicht schreiben können.
Es gibt nicht genug Platz auf der Festplatte.

Mein Vorschlag wäre, das Qualifikationsmerkmal „Anhängen“ für die Textdatei speichern zu verwenden.

Dadurch können Sie die Ausgabedatei kontinuierlich füllen