[英]How to go back to the first line of a file without re-instantiating Bufferedreader?
for(String column: columnHeaders){
loadFile(); // Here BufferedReader gets instantiated
String header =getLineReader().readLine();
if(header!=null)
{
while (( line=getLineReader().readLine())!=null )
{
cellValue =StatUtils.getCellValue(line,getColumnNumberByName(column));
csvColumn.addRowElement(cellValue,null);
}
}
closeStreams(); // closing the Reader
}
對於每一列,我都需要從頭到尾讀取csv文件。 文本文件可能很大(100列和5000000行)。
現在,為每列創建一個BufferedReader實例-1)這會影響性能嗎? 2)有什么方法可以一次創建Reader,只要它到達最后一行,在下一次迭代中,它將從頭開始。
就像我說的那樣,文件可能很大,因此,我不想將其緩存到內存中。
有什么建議/意見嗎?
提前致謝。
與再次讀取整個“非常大”文件的開銷相比,為每列創建一個新的BufferedReader
的開銷將可以忽略不計。
每當您擔心性能時,應該采取的第一步就是衡量。 您當前的實現實際上比您想要的慢嗎? 如果看起來足夠快,那就別管它了。
如果事實證明它的速度比您想要的慢,那么“優化”的最佳方法就是讀取文件一次,而不是為您關心的每一列讀取一次。 除了采用單個列名之外,您還可以將列名Map
到“列處理器”。 每個“列處理器”都將獲得其列的連續值,並計算其應計算的值(例如:總和,平均值,平方和,甚至只是將值存儲在集合中)。
不應該是一個問題。 默認情況下,BufferedReader僅高速緩存文件的4096字節。 因此,與嘗試掃描回文件的開始相比,創建新的BufferedReader所需的資源最少。
您使用的行為似乎是掃描每一列的整個文件。 如果您遇到性能問題,那么很可能是問題的根源(不是創建新的BufferedReaders)。 嘗試確定文件的標題是什么(即,您需要多少列),然后逐行而不是逐列處理數據。
如果您確實要查找文件中的任何位置,請嘗試查看RandomAccessFile 。
哦,天哪! 您的問題將是該算法的性能。 實際上,您是在大量數據上編寫O(N ^ 2)算法。 無論如何,它的表現都不好。 您需要找出一種可能將其部分存儲在內存中的方法,或者使用某種可以匯總使用的指標來代替重新掃描剛剛掃描的所有內容。
但是,無論如何,如果基礎的Readers / InputStream支持文件,則可以使用java.io.Reader.reset()返回文件的開頭。 FileReader通常會這樣做。 打倒你自己的孩子。 您會把眼睛睜開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.