2017-07-15 4 views
0

私は、ローカルサーバーでCSVファイルを持っていると私は、コードの下に使用してプレイ応じて、このファイルを送信しています:再生フレームワークを使用してCSVファイルを圧縮する方法は?

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

しかし、CSVファイルには、100ギガバイト件まですることができます。だから私はこのCSVファイルを再生アプリケーションの応答に送信する前に圧縮したいと思う。遊びでは、私はこれを見つけたlink応答をgzippedする必要があるフィルタを追加します。私はそれを試みたが、運がない。

このGzipFilter仕組み:

  1. は、それがファイルにどのような拡張子を与えるのでしょうか? .csvではなく.zipですか?
  2. 記載されているリンクの外に何かする必要がありますか?

再生フレームワークでCSVファイルを圧縮する他の方法はありますか?

答えて

2

ファイルが100GBまでである可能性があるので、filtersまたはcontrollerにファイルを圧縮する方法はありません。ファイルをメモリに読み込む際に、ヒープを吹き飛ばすだけです。

csvをhddに保存し、zipする必要があります。その後、圧縮されたファイルをストリームとして配信してください。

0

回答者:ate大きなファイルは、ファイルをメモリにロードするときにヒープを吹き飛ばします。だから、私はそれに書いている間にファイルを圧縮しようとしました。私は単純に大きなファイルを圧縮するために以下のアプローチを使用しました:

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() 
関連する問題