如何使用播放框架压缩 CSV 文件?
Posted
技术标签:
【中文标题】如何使用播放框架压缩 CSV 文件?【英文标题】:How to compress a CSV file using play framework? 【发布时间】:2017-07-15 04:45:24 【问题描述】:我在本地服务器中有一个 CSV 文件,我正在使用以下代码在播放响应中发送此文件:
def index = Action
Ok.sendFile(new java.io.File("fileToServe.csv"))
但 CSV 文件最大可达 100GB。所以我想在将它发送到播放应用程序响应之前压缩这个 CSV 文件。在游戏中,我发现了这个link 来添加过滤器,哪些响应应该被压缩。我试过了,但没有运气。
这个 GzipFilter 是如何工作的:
-
文件的扩展名是什么?是 .zip 而不是 .csv?
我需要在所描述的链接之外做任何事情吗?
还有其他方法可以在 play framework 中压缩 CSV 文件吗?
【问题讨论】:
【参考方案1】:既然您说您的文件可能高达 100GB,那么您无法将其压缩到您的 filters
或 controller
中。这只会在将文件加载到内存时破坏您的堆。
您需要将 csv
保存到硬盘,zip
在那里,然后将压缩文件作为流提供!
【讨论】:
【参考方案2】:正如 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()
【讨论】:
以上是关于如何使用播放框架压缩 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?
如何在不使用 Java 的情况下压缩 .csv 文件并在电子邮件中附加 Oracle plsql