0

仕事でcsvファイルを解析する必要があります。ファイルの各行はそれほど長くはなく、数百文字しかありません。次のコードを使用して、ファイルをメモリに読み込みました。

def lines = []
new File( fileName ).eachLine { line -> lines.add( line ) }

行数が 10,000 の場合、コードは問題なく動作します。ただし、行数を 100,000 に増やすと。このエラーが発生しました:

java.lang.OutOfMemoryError: Java heap space

10,000 行の場合、ファイル サイズは約 7 MB、100,000 行の場合は ~70 MB です。では、この問題をどのように解決しますか?ヒープサイズを増やすことが回避策であることは知っています。しかし、他の解決策はありますか?前もって感謝します。

4

2 に答える 2

0

CSV ファイルをデータベースに配置しようとしている可能性が高いと仮定すると、次のようなことができます。重要な groovy 機能は、splitEachLine(yourDelimiter)であり、クロージャで fields 配列を使用します。

import groovy.sql.*

def sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:ORCL",
    "scott", "tiger", "oracle.jdbc.driver.OracleDriver")

//define a variable that matches a table definition (jdbc dataset
def student = sql.dataSet("TEMP_DATA");
//now iterate over the csv file splitting each line on commas and load the into table.
new File("C:/temp/file.csv").splitEachLine(","){ fields ->
//insert each column we have into the temp table.
 student.add(
        STUDENT_ID:fields[0],
        FIRST_NAME:fields[1],
        LAST_NAME:fields[2]
    )
}
//yes the magic has happened the data is now in the staging table TEMP_DATA.
println "Number of Records  " + sql.firstRow("Select count(*) from TEMP_DATA")
于 2013-08-29T14:28:12.270 に答える