我在本地服务器上有一个CSV文件,我使用以下代码在播放响应中发送此文件:
def index = Action {
Ok.sendFile(new java.io.File("fileToServe.csv"))
}
但CSV文件最高可达 100GB 。所以我想在将此CSV文件发送到播放应用程序响应之前压缩它。在游戏中,我发现这个link添加了应该被gzip压缩的过滤器。我尝试过,但没有运气。
这个GzipFilter的工作原理:
还有其他方法可以在Play框架中压缩CSV文件吗?
答案 0 :(得分:2)
由于您说过您的文件最高可达100GB,因此您无法在filters
或controller
中处理该文件。这会在将文件加载到内存时简单地烧掉你的堆。
您需要将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()