【问题标题】:How to compress a CSV file using play framework?如何使用播放框架压缩 CSV 文件?
【发布时间】:2017-07-15 04:45:24
【问题描述】:

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

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

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

这个 GzipFilter 是如何工作的:

  1. 文件的扩展名是什么?是 .zip 而不是 .csv?
  2. 我需要在所描述的链接之外做任何事情吗?

还有其他方法可以在 play framework 中压缩 CSV 文件吗?

【问题讨论】:

    标签: scala gzip playframework-2.4


    【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多