如何使用play框架压缩CSV文件?

时间:2017-07-15 04:45:25

标签: scala gzip playframework-2.4

我在本地服务器上有一个CSV文件,我使用以下代码在播放响应中发送此文件:

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

但CSV文件最高可达 100GB 。所以我想在将此CSV文件发送到播放应用程序响应之前压缩它。在游戏中,我发现这个link添加了应该被gzip压缩的过滤器。我尝试过,但没有运气。

这个GzipFilter的工作原理:

  1. 它给文件的扩展名是什么?是.zip而不是.csv?
  2. 我是否需要在所描述的链接之外做任何事情?
  3. 还有其他方法可以在Play框架中压缩CSV文件吗?

2 个答案:

答案 0 :(得分:2)

由于您说过您的文件最高可达100GB,因此您无法在filterscontroller中处理该文件。这会在将文件加载到内存时简单地烧掉你的堆。

您需要将csv保存到hdd,zip,然后将压缩文件作为流提供!

答案 1 :(得分: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()