[英]Most efficient way to create a Scala Map from a file of strings?
現在,我試圖從csv文件中創建Map[String, String]
,其中單詞是Key * ,發音是Value 。 我自己使用下面的代碼成功做到了。
def mapFile(filename: String): Map[String, String] = {
var content: String = ""
val file: BufferedSource = Source.fromFile(filename)
for (line <- file.getLines()) {
if (!line.contains("//")) {
content = content + line + "//"
}
}
content.split("//").map(_.split(" ")).map(arr => arr(0) -> arr(1)).toMap
}
因此,文件讀取了文本文件,並為文本文件中不是//
每一行創建了一個字符串,然后將該字符串拆分為鍵值,鍵被" "
分割,值被`“ / /“``。
但是,它太慢了。
有沒有一種更有效的方法可以創建地圖,而無需花費5分鍾?
我相信您的主要問題是,您正在將所有文件讀入字符串中,以便在以后對其進行重新處理。 這意味着,您不僅分配了兩次所需的內存,而且還對文件進行了兩次處理 。
您可能對代碼進行的第一個改進是僅需一次迭代即可完成所有操作。
import scala.io.Source
def mapFile(filename: String): Map[String, String] =
(for {
line <- Source.fromFile(filename).getLines
if (line.nonEmpty && !line.startsWith(";;;"))
Array(word, pronunciation) = line.split(" ")
} yield word -> pronunciation).toMap
上面的代碼與此等效(並將簡化為類似的代碼) :
import scala.io.Source
def mapFile(filename: String): Map[String, String] =
Source
.fromFile(filename)
.getLines
.filter(line => line.nonEmpty && !line.startsWith(";;;"))
.map(line => line.split(" "))
.map { case Array(word, pronunciation) => word -> pronunciation }
.toMap
另外,如果輸入文件太大,則可以查看FS2或Akka-Streams或任何其他類型的流處理以按塊處理文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.