<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;
無法寫作。
磁碟空間不足。
