Java将mysql输出csv_使用Java将大量数据从数据库导出到.csv时出...
我,謝謝您的關注.
我想使用Java將大量數據,實際上是大量數據(600萬行)導出到.csv文件.該應用程序是使用toplink(ojdbc14)的JPA擺動應用程序.
我嘗試使用:
但是BufferedWriter
RandomAccessFile的
FileChannel
等等,但是盡管我將最大堆大小設置為800m(-Xmx800m),但是內存消耗仍然很高,導致Java堆內存不足異常.
我的源代碼的最新版本:
...(more lines of code)
FileChannel channel = getRandomAccessFile(tempFile).getChannel();
Object[][] data = pag.getRawData(); //Database data in a multidimentional array
for (int j = 0; j < data.length; j++) {
write(data[j], channel); //write data[j] (an array) into the channel
freeStringLine(data[j]); //data[j] is an array, this method sets all positions =null
data[j] = null;//sets reference in null
}
channel.force(false); //force writing in file system (HD)
channel.close(); //Close the channel
pag = null;
...(more lines of code)
private void write(Object[] row, FileChannel channel) throws DatabaseException {
if (byteBuff == null) {
byteBuff = ByteBuffer.allocateDirect(1024 * 1024);
}
for (int j = 0; j < row.length; j++) {
if (j < row.length - 1) {
if (row[j] != null) {
byteBuff.put(row[j].toString().getBytes());
}
byteBuff.put(SPLITER_BYTES);
} else {
if (row[j] != null) {
byteBuff.put(row[j].toString().getBytes());
}
}
}
byteBuff.put("
".toString().getBytes());
byteBuff.flip();
try {
channel.write(byteBuff);
} catch (IOException ex) {
throw new DatabaseException("Imposible escribir en archivo temporal de exportación : " + ex.getMessage(), ex.getCause());
}
byteBuff.clear();
}
作為600萬行,我不想在創建文件時將該數據存儲在內存中.我制作了許多臨時文件(每個文件有5000行),最后,使用兩個FileChannel將所有這些臨時文件附加到一個文件中.但是,缺少內存的異常是在加入之前啟動的.
您現在是否是導出大量數據的另一種策略?
非常感謝您的答復.對不起,我的英文,我正在提高xD
總結
以上是生活随笔為你收集整理的Java将mysql输出csv_使用Java将大量数据从数据库导出到.csv时出...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帮别人担保贷款别人不还怎么办
- 下一篇: 民生信用卡申请审核要几天