簡體   English   中英

用Java讀取大量數據的有效方法是什么

[英]What is the efficient way for reading large content of data in Java

首先,我是Java新手,對於以下問題我需要一些幫助。

我有一個包含數百萬條記錄的Java列表。 我想將此數據列表導出為CSV文件。 以下是我編寫的用於讀取數據的函數,但對數百萬條記錄而言,該函數失敗。 您能提出一些更好的方法嗎?

 private String generateCsvData(List<Map<String, Object>> rows) {

    String output = reportService.getReportHeadder();

    for (Map row : rows) {  

        output += (Long) row.get("branchId")
                + ","
                + StringEscapeUtils.escapeCsv((String) row.get("branches"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row
                        .get("categoryName"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row.get("products"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row.get("emails"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row
                        .get("contactAddress"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row
                        .get("contactDet")) + ","
                + StringEscapeUtils.escapeCsv((String) row.get("url"))
                + "\n";

    }

    return output;
}

我建議使用OpenCSV 它對將數據讀取和寫入CSV文件具有很好的支持。

是的,輕松愉快。

如果您打算一次將所有記錄保存在內存中,則會遇到問題。 您的機器只有這么多的內存,並且只有一部分分配給JVM。 當您填充它時,游戲就結束了。 您已經在Map擁有了數據。 當您必須同時存儲其.csv表示形式時,問題就會加倍。

一種解決方案是一次流出一行。 您可以遍歷Map並且只存儲一次數據。

另一個解決方案可能是將所有這些數據存儲在關系數據庫表中。 您可以遍歷ResultSet並以這種方式流式傳輸結果。 現在,您已經真正減少了內存需求。

您創建行的機制不好。 與串聯相比,我更喜歡StringBuilder

問題是您要創建一個veeeery長字符串,然后將其寫入文件。

此外,您要在連接的每個領帶上創建一個新的String。 在這種情況下,請使用StringBuilder

您必須使用流順序寫入。 基本io是開始學習的好地方

您將所有內容存儲在String中,然后再寫入文件,如果在生成文件時將它們逐行寫入文件,該怎么辦?

使用CSV庫,例如OpenCSV

您可以逐行處理文件-讀取一行,然后對其進行處理,然后再次將其丟棄。 這樣,文件中最多只有一行在內存中。

首先,如果您在循環中構造一個字符串,請不要串聯字符串,但是我們使用StringBuilder因為它通常性能更好,並且不會浪費很多中間字符串。

但是,在這種情況下,我建議不要將所有內容都保留在內存中,而應在處理過程中直接寫入文件。 這將減少所需的內存。 查看PrintWriter或尋找已經滿足您需要的庫(例如OpenCSV )。

為什么不使用像Spring Batch這樣的框架,它對操作進行分塊,從理論上講,它有助於編寫許多代碼! 記錄

暫無
暫無

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

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