如何使用播放框架压缩 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,那么您无法将其压缩到您的 filterscontroller 中。这只会在将文件加载到内存时破坏您的堆。

您需要将 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 文件?

如何通过 postgres 中的存储函数压缩 CSV 文件

如何在不使用 Java 的情况下压缩 .csv 文件并在电子邮件中附加 Oracle plsql

我如何在 React js 中压缩任何图像以及 Excel 和 CSV 文件

说说如何利用 Python 处理 CSV 文件

如何将mysql多个outfiles转换成单个压缩zip