<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Vorrei produrre una grande quantità di dati di testo da uno script JMP. Posso utilizzare la concatenazione di stringhe per creare l'output e quindi scriverlo tutto in una volta con il comando Salva file di testo. Tuttavia, questo è molto inefficiente e diventa impossibile man mano che la stringa cresce.
JMP supporta flussi di file che consentono di indirizzare l'output della stringa su un buffer durante la creazione?
Grazie per l'approccio dettagliato. La combinazione dell'uso di un elenco per il raggruppamento e l'uso di Salva file di testo con Aggiungi fornisce una buona approssimazione di un flusso di file. Con questo approccio, devo codificare manualmente la dimensione del contenitore e le operazioni di aggiunta periodiche, ma con quelle implementate le prestazioni sono ragionevoli.
Un'altra strategia per aggirare il rallentamento delle stringhe molto lunghe: creare un elenco di stringhe più brevi e utilizzare ConcatItems( list ) per unirle in un'unica stringa.Specifica il separatore necessario, che potrebbe essere "" se non è necessario aggiungere un separatore tra gli elementi. Prima di JMP 13 potrebbe essere necessario creare attentamente l'elenco anche se conterrà migliaia di elementi...vedi Elenco veloce. Questo esempio mostra l'approccio build-it-in-reverse.
lista = {};
inserisci in(lista, "riga1", 1);
inserisci in(lista, "riga2", 1);
inserisci in(lista, "riga3", 1);
lista = inverti(lista);
ConcatItems( lista, "\!n");
"Linea 1
linea 2
linea3"
Se puoi scegliere, mantieni le stringhe tra 10.000 e 100.000 caratteri.Troppo breve e potresti (forse) riscontrare problemi con un numero enorme di elementi dell'elenco, ciascuno con il proprio sovraccarico.Troppo lungo e avrai ancora il problema della concatenazione lenta (che è un problema N ^ 2, quindi gestire la lunghezza delle stringhe in questo modo lo farà Veramente aiuto).
Ciononostante, le stringhe JSL sono limitate a 2^31 (2 GB) caratteri.Penso che l'idea di aggiunta di Jim funzionerà per più di 2 GB.Ti consigliamo comunque di aggiungere blocchi ragionevolmente grandi al file perché ogni salvataggio+aggiunta ha un'apertura/scrittura/chiusura in testa.In questo esempio vengono scritti 500.000.000 di blocchi di caratteri, finché il disco non si riempie.
txt = Ripeti("a", 5e8);
Salva file di testo ("$temp\deleteme.txt", txt, Modalità( "sostituisci"));
Mostra( Dimensione file( "$temp\deleteme.txt" ) );
For( i = 1, i <= 20, i++,
Salva file di testo( "$temp\deleteme.txt", txt, Modalità( "append" ) );
Mostra( Dimensione file( "$temp\deleteme.txt" ) );
);
Dimensione file ("$temp\deleteme.txt") = 500000000;
Dimensione file ("$temp\deleteme.txt") = 1000000000;
Dimensione file ("$temp\deleteme.txt") = 1500000000;
Dimensione file ("$temp\deleteme.txt") = 2000000000;
Dimensione file ("$temp\deleteme.txt") = 2500000000;
Dimensione file ("$temp\deleteme.txt") = 3000000000;
Dimensione file ("$temp\deleteme.txt") = 3500000000;
Dimensione file ("$temp\deleteme.txt") = 4000000000;
Dimensione file ("$temp\deleteme.txt") = 4500000000;
Dimensione file ("$temp\deleteme.txt") = 5000000000;
Dimensione file ("$temp\deleteme.txt") = 5500000000;
Incapace di scrivere.
Non c'è abbastanza spazio sul disco.

Il mio suggerimento sarebbe quello di utilizzare il qualificatore "Aggiungi" sul file di testo di salvataggio.

Ciò ti consentirà di popolare il file di output su base continuativa