<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我想从 JMP 脚本输出大量文本数据。 我可以使用字符串连接来构建输出,然后使用“保存文本文件”命令一次将其全部写入。 然而,这是非常低效的,并且随着字符串的增长而变得不可行。
JMP 是否支持文件流,允许我在创建缓冲区时将字符串输出定向到缓冲区?
感谢您提供详细的方法。 结合使用列表进行分箱和使用“保存文本文件与追加”可以很好地近似文件流。 使用这种方法,我需要手动编码 bin 大小和定期追加操作,但通过这些实现,性能是合理的。
解决非常长的字符串减慢问题的另一种策略:构建较短字符串的列表并使用 ConcatItems( list ) 将它们连接成单个字符串。指定您需要的分隔符,如果您不需要在项目之间添加分隔符,则可以是“”。 在 JMP 13 之前,如果列表包含数千个项目,您可能还需要仔细构建列表...请参阅快速列表。 此示例展示了反向构建方法。
列表={};
插入(列表,“第1行”,1);
插入(列表,“第2行”,1);
插入(列表,“第3行”,1);
列表=反向(列表);
ConcatItems( 列表, "\!n");
“第1行
第2行
第3行”
如果可以选择,请将字符串保留在 10,000 到 100,000 个字符附近。太短,您(可能)会遇到大量列表项的问题,每个列表项都有自己的开销。太长,您仍然会遇到缓慢的连接问题(这是一个 N^2 问题,因此以这种方式管理字符串的长度将真的帮助)。
但尽管如此,JSL 字符串的长度限制为 2^31 (2 GB) 个字符。我认为 Jim 的附加想法适用于 2GB 以上。您仍然需要将相当大的块附加到文件中,因为每个保存+附加都有打开/写入/关闭的开销。此示例正在写入 500,000,000 个字符块,直到磁盘填满。
txt = 重复(“a”, 5e8);
保存文本文件( "$temp\deleteme.txt", txt, Mode( "replace" ) );
Show( 文件大小( "$temp\deleteme.txt" ) );
对于( i = 1, i <= 20, i++,
保存文本文件( "$temp\deleteme.txt", txt, Mode( "append" ) );
Show( 文件大小( "$temp\deleteme.txt" ) );
);
文件大小("$temp\deleteme.txt") = 500000000;
文件大小("$temp\deleteme.txt") = 1000000000;
文件大小("$temp\deleteme.txt") = 1500000000;
文件大小("$temp\deleteme.txt") = 2000000000;
文件大小("$temp\deleteme.txt") = 2500000000;
文件大小("$temp\deleteme.txt") = 3000000000;
文件大小("$temp\deleteme.txt") = 3500000000;
文件大小("$temp\deleteme.txt") = 4000000000;
文件大小("$temp\deleteme.txt") = 4500000000;
文件大小("$temp\deleteme.txt") = 5000000000;
文件大小("$temp\deleteme.txt") = 5500000000;
无法写作。
磁盘空间不足。
