<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Me gustaría generar una gran cantidad de datos de texto desde un script JMP. Puedo usar la concatenación de cadenas para generar el resultado y luego escribirlo todo de una vez con el comando Guardar archivo de texto. Sin embargo, esto es muy ineficiente y se vuelve inviable a medida que crece la cadena.
¿JMP admite secuencias de archivos que me permitirían dirigir la salida de la cadena a un búfer a medida que se crea?
Gracias por el enfoque detallado. Combinar el uso de una lista para agrupar y usar Guardar archivo de texto con Agregar proporciona una buena aproximación de una secuencia de archivos. Con este enfoque, necesito codificar manualmente el tamaño del contenedor y las operaciones de adición periódicas, pero con las implementadas el rendimiento es razonable.
Otra estrategia para solucionar la desaceleración de cadenas muy largas: cree una lista de cadenas más cortas y use ConcatItems( list ) para unirlas en una sola cadena.Especifique el separador que necesita, que podría ser "" si no necesita que se agregue un separador entre los elementos. Antes de JMP 13, es posible que también necesite crear la lista con cuidado si tendrá miles de elementos... consulte Lista rápida. Este ejemplo muestra el enfoque de construcción inversa.
lista = {};
insertar en(lista, "línea1", 1);
insertar en(lista, "línea2", 1);
insertar en(lista, "línea3", 1);
lista = revertir(lista);
ConcatItems( lista, "\!n");
"línea 1
línea 2
línea 3"
Si tiene la opción, mantenga las cadenas en el rango de 10.000 a 100.000 caracteres.Si es demasiado breve, (tal vez) tendrá problemas con una gran cantidad de elementos de la lista, cada uno con su propia sobrecarga.Demasiado largo y seguirás teniendo el problema de la concatenación lenta (que es un problema N^2, por lo que gestionar la longitud de las cadenas de esta manera en realidad ayuda).
Pero a pesar de todo eso, las cadenas JSL están limitadas a 2^31 (2 GB) caracteres.Creo que la idea de agregar de Jim funcionará para más de 2 GB.Aún querrás agregar bloques razonablemente grandes al archivo porque cada guardar+agregar tiene apertura/escritura/cierre generales.Este ejemplo está escribiendo 500.000.000 bloques de caracteres, hasta que el disco se llene.
txt = Repetir( "a", 5e8 );
Guardar archivo de texto( "$temp\deleteme.txt", txt, Modo( "reemplazar" ) );
Mostrar( Tamaño del archivo( "$temp\deleteme.txt" ) );
Para (i = 1, i <= 20, i++,
Guardar archivo de texto( "$temp\deleteme.txt", txt, Modo( "append" ) );
Mostrar( Tamaño del archivo( "$temp\deleteme.txt" ) );
);
Tamaño del archivo("$temp\deleteme.txt") = 500000000;
Tamaño del archivo("$temp\deleteme.txt") = 1000000000;
Tamaño del archivo("$temp\deleteme.txt") = 1500000000;
Tamaño del archivo("$temp\deleteme.txt") = 2000000000;
Tamaño del archivo("$temp\deleteme.txt") = 2500000000;
Tamaño del archivo("$temp\deleteme.txt") = 3000000000;
Tamaño del archivo("$temp\deleteme.txt") = 3500000000;
Tamaño del archivo("$temp\deleteme.txt") = 4000000000;
Tamaño del archivo("$temp\deleteme.txt") = 4500000000;
Tamaño del archivo("$temp\deleteme.txt") = 5000000000;
Tamaño del archivo("$temp\deleteme.txt") = 5500000000;
Incapaz de escribir.
No hay suficiente espacio en el disco.

Mi sugerencia sería utilizar el calificador "Agregar" en Guardar archivo de texto.

Esto le permitirá completar el archivo de salida de forma continua.