【问题标题】:Scala: Source.fromInputStream failed for bigger inputScala:Source.fromInputStream 无法获得更大的输入
【发布时间】:2015-09-10 15:52:17
【问题描述】:

我正在从 AWS S3 读取数据。如果输入文件很小,则以下代码可以正常工作。输入文件很大时失败。是否有任何参数可以修改以增加缓冲区大小或任何其他参数,以便它也可以处理更大的输入文件?谢谢!

    val s3Object= s3Client.getObject(new GetObjectRequest("myBucket", "myPath/myFile.csv"));

    val myData = Source.fromInputStream(s3Object.getObjectContent()).getLines()
    for (line <- myData) {
        val data = line.split(",")
        myMap.put(data(0), data(1).toDouble)
    }

    println(" my map : " + myMap.toString())

【问题讨论】:

  • 当输入很大时您遇到的故障到底是什么?

标签: scala amazon-s3 inputstream


【解决方案1】:

如果您查看source code,您会发现它在内部调用了Source.createBufferedSource。您可以使用它来创建具有更大缓冲区大小的自己的版本。

这些是来自 scala 的代码行:

  def createBufferedSource(
    inputStream: InputStream,
    bufferSize: Int = DefaultBufSize,
    reset: () => Source = null,
    close: () => Unit = null
  )(implicit codec: Codec): BufferedSource = {
    // workaround for default arguments being unable to refer to other parameters
    val resetFn = if (reset == null) () => createBufferedSource(inputStream, bufferSize, reset, close)(codec) else reset

    new BufferedSource(inputStream, bufferSize)(codec) withReset resetFn withClose close
  }

  def fromInputStream(is: InputStream, enc: String): BufferedSource =
    fromInputStream(is)(Codec(enc))

  def fromInputStream(is: InputStream)(implicit codec: Codec): BufferedSource =
    createBufferedSource(is, reset = () => fromInputStream(is)(codec), close = () => is.close())(codec)

编辑:现在我对您的问题有了更多的考虑,您可以通过这种方式增加缓冲区大小,但我不确定这是否真的能解决您的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多