簡體   English   中英

鑄造昂貴的操作?

[英]Is casting an expensive operation?

場景

  • 我正在解析一個大文件(字符文件)。 例如.csv文件(不完全是我的情況)
  • 我無法將整個文件保存在內存中。 所以我必須實施一個緩沖策略。
  • 我想構建一個通用的處理程序,它將在內存中保持一定數量的行(如Strings)。 如果需要,此處理程序在刪除不需要的行時獲取其他行。
  • 在這個處理程序上,我將構建一個解析器,它將行轉換為Java對象並對這些對象進行更改。 完成更改(更新對象上的某些字段)后,將更改保留回文件。

我應該

  • 不是將緩沖區保持為字符串數組,而應該將緩沖區直接保存為對象(進行單個轉換)? 要么...
  • 將緩沖區保持為行,每次我需要對緩沖區進行操作,將信息轉換為正確的對象,進行更改,將更改保留回文件。 順序操作需要補充演員。

我必須保持簡單。 有什么建議 ?

強制轉換不會更改對象占用的內存量。 它只是改變了運行時類型。

如果您可以按行進行這些操作,那么只需在循環內執行操作即可讀取單行。

while ((line = reader.readLine()) != null) {
    line = process(line);
    writer.println(line);
}

這樣,您每次只能在Java內存中只有一行而不是整個文件。

或者,如果您需要基於整個CSV文件執行這些操作(即,這些操作依賴於所有行),那么最有效的方法是將CSV文件導入真實的SQL數據庫,然后使用SQL語句來更改數據,然后再次將其導出為CSV文件。

我建議使用MappedByteBuffer(來自NIO),您可以使用它來讀取太大而無法放入內存的文件。 它只將文件的一個區域映射到內存中; 一旦你讀完這個區域(比如說,前10k),就要映射下一個區域,依此類推,直到你讀完整個文件。 內存效率高,易於實現。

Java Casts:喜歡

Object a = new String();
String b (String) a;

不貴。 - 無論你是否施放弦樂或任何其他類型。

您真正的增值將是將每行讀取為String,這在Java中非常簡單。 在它的字符串之后,在每個逗號上拆分字符串是微不足道的

String[] row = parsedRow.split(",");

對於數組中的每個值,您將擁有一個String,然后可以對其進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM