gpt4 book ai didi

scala - 使用 Akka Streams 读取大文件

转载 作者:行者123 更新时间:2023-12-03 07:24:52 24 4
gpt4 key购买 nike

我正在尝试 Akka Streams,这里有一个简短的片段:

  override def main(args: Array[String]) {
val filePath = "/Users/joe/Softwares/data/FoodFacts.csv"//args(0)

val file = new File(filePath)
println(file.getAbsolutePath)
// read 1MB of file as a stream
val fileSource = SynchronousFileSource(file, 1 * 1024 * 1024)
val shaFlow = fileSource.map(chunk => {
println(s"the string obtained is ${chunk.toString}")
})
shaFlow.to(Sink.foreach(println(_))).run // fails with a null pointer

def sha256(s: String) = {
val messageDigest = MessageDigest.getInstance("SHA-256")
messageDigest.digest(s.getBytes("UTF-8"))
}
}

当我运行此代码片段时,我得到:

Exception in thread "main" java.lang.NullPointerException
at akka.stream.scaladsl.RunnableGraph.run(Flow.scala:365)
at com.test.api.consumer.DataScienceBoot$.main(DataScienceBoot.scala:30)
at com.test.api.consumer.DataScienceBoot.main(DataScienceBoot.scala)

在我看来,不是fileSource只是空的?为什么是这样?有任何想法吗? FoodFacts.csv 大小为 40MB,而我要做的就是创建一个 1MB 的数据流!

即使使用 8192 的 defaultChunkSize 也不起作用!

最佳答案

好吧,1.0 已被弃用。如果可以的话,请使用 2.x

当我尝试使用 FileIO.fromFile(file) 而不是 SynchronousFileSource 来使用 2.0.1 版本时,编译失败消息由于空指针而失败。这只是因为它的范围内没有 ActorMaterializer。包含它,使其工作:

object TImpl extends App {
import java.io.File

implicit val system = ActorSystem("Sys")
implicit val materializer = ActorMaterializer()

val file = new File("somefile.csv")
val fileSource = FileIO.fromFile(file,1 * 1024 * 1024 )
val shaFlow: Source[String, Future[Long]] = fileSource.map(chunk => {
s"the string obtained is ${chunk.toString()}"
})

shaFlow.runForeach(println(_))
}

这适用于任何大小的文件。有关调度程序配置的更多信息,请参阅here .

关于scala - 使用 Akka Streams 读取大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com