
我正在嘗試使用 pgfplots 繪製一個包含多列的非常大的 .csv 檔案。我想將第一列用於我的所有繪圖。我通常的例行公事是做這樣的事情:
\addplot [solid] table [x=A,y=B]{mydata.cvs};
\addplot [solid] table [x=A,y=C]{mydata.cvs};
\addplot [solid] table [x=A,y=nth]{mydata.cvs};
這項工作與 LuaLatex(動態記憶體)結合起來效果很好,並且不需要太多時間來產生繪圖。然而,我決定改進我的編碼(認為它也可以提高編譯速度),只需在開始時讀取一次表格,使用:
\pgfplotstableread[col sep=semicolon]{mydata.csv}\mytableone
進而:
\addplot [solid] table [x=A,y=B]{\mytableone};
\addplot [solid] table [x=A,y=C]{\mytableone};
\addplot [solid] table [x=A,y=nth]{\mytableone};
執行此操作後,該過程會花費更多時間,有時甚至無法編譯並崩潰。有人可以解釋為什麼編譯速度存在巨大差異以及可能導致崩潰的原因嗎?
抱歉,我沒有一個很好的例子,無法分享我的數據(無論如何都非常大)。
謝謝=)
PD 我還想在列中選擇一個範圍,為此我使用此解決方案選擇行表 pgfplots。不確定這是否也會導致問題。
答案1
您的觀察是正確的:多次重新讀取相同檔案比重複使用「檔案句柄」好得多。
這種意外行為的原因與 TeX 中程式設計的工作方式(或在本例中不起作用)有關:根本不存在(有效的)陣列資料類型。實現數組資料類型的唯一方法是使用「正常」的全域巨集空間,這會導致(導致)更多的記憶體消耗,並且很容易達到 TeX 的嚴格限制。
Lua 將具有高效的陣列資料類型,但表格的 pgfplots 核心還沒有專用的 Lua 表示形式。
關於重新讀取文件和讀取一次文件之間的區別的更多詳細信息記錄在“完全讀取”鍵的手冊中(當然不是最好的地方)。