簡體   English   中英

從字符串文件創建Scala Map的最有效方法?

[英]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

另外,如果輸入文件太大,則可以查看FS2Akka-Streams或任何其他類型的處理以按塊處理文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM