2017-07-15 75 views
0

我在本地服務器的CSV文件,我使用下面的代碼在劇中響應發送此文件:如何使用播放框架壓縮CSV文件?

def index = Action { 
    Ok.sendFile(new java.io.File("fileToServe.csv")) 
} 

但CSV文件可高達100GB 。所以我想在發送它到播放應用程序響應之前壓縮這個CSV文件。在遊戲中,我發現這個link添加了過濾器,應該對這些響應進行gzip壓縮。我嘗試過但沒有運氣。

這GzipFilter工作原理:

  1. 沒有給出該文件擴展名是什麼?是.zip而不是.csv?
  2. 我是否需要在描述的鏈接之外做任何事情?

在播放框架中是否有其他方法來壓縮CSV文件?

回答

2

既然你說你的文件可能高達100GB,你無法在你的filterscontroller中處理它。這會在將文件加載到內存時簡單地炸掉你的堆。

您需要將csv保存到hdd,zip那裏,然後將壓縮文件作爲流提供!

0

Atais回答,大文件將簡單地吹堆,而將文件加載到內存中。所以我試圖在寫入文件時壓縮文件。我只是用下面的方法來實現壓縮大文件:

val fileToServe = TemporaryFile(new File(fileNameWithoutExtension + ".zip")) 
val fos = new FileOutputStream(fileToServe.file) 
val bos = new BufferedOutputStream(fos) 
val zos = new ZipOutputStream(bos) 
zos.putNextEntry(new ZipEntry(fileNameWithoutExtension + ".csv")) 

/*write data(Don't read all the data at once from database or anywhere) 
    as it will blow up memory for large file*/ 
zos.write(data.getBytes) 

zos.closeEntry() 
zos.close()