如何通过Scala中的自定义功能对大型文本文件中的行进行排序?

javachessgui

我有一个文本文件,其结构为第一行包含制表符分隔的键,而所有后续行均包含这些键的制表符分隔的值。因此,可以使用第一行将每一行变成键值对的映射。

我想按地图中的某些键对此类文件的行进行排序,然后将它们保存为已排序。

我这样读取文件:

def parseTxtSimple(path: String):Array[String]=
{
   Source.fromFile(path).getLines().toArray
}

然后,我使用compfunc对其进行排序:

val lines=parseTxtSimple(key+"/"+name)

// identify record keys from first line ( used by compfunc )
// strip is my own function that removes all \r and \n characters

val header=strip(lines.head).split("\t")

// sort lines

val lines_sorted:Array[String]=lines.tail.sortWith((leftE,rightE) => compfunc(leftE,rightE)).toArray

这是功能:

def compfunc(leftE:String,rightE:String):Boolean =
{
   val leftEr=(header zip strip(leftE).split("\t")).toMap
   val rightEr=(header zip strip(rightE).split("\t")).toMap
   var ratingLeftE:Float=0.0.toFloat
   var ratingRightE:Float=0.0.toFloat
   if(leftEr.contains("rating")) ratingLeftE=myToFloat(leftEr("rating"))
   if(rightEr.contains("rating")) ratingRightE=myToFloat(rightEr("rating"))
   ratingLeftE > ratingRightE
}

我的问题是排序速度很慢,即使是20 MB的文本文件,程序也会用尽内存。

如果我读取文本文件而不是将字符串数组作为值数组(通过用“ \ t”分隔每一行)读取并使用这些预处理数组,而不是在compfunc中使用“ \ t”分隔它们并不好。

整个程序在这里找到:

https://github.com/fideplayerslist/fideplayerslist/blob/master/players.scala

SV
  def printOutput(header : Array[String], sorted : Array[String]) {
      println(header.mkString("\t"))
      sorted.foreach { x => println(x) }

  }
  def parseAndSortFile(lines: Array[String]): Unit = {
    val header = lines.head.split("\t")
    val ratingColumn = header.indexOf("ratings")
    if (ratingColumn == -1) {
      println("could not find ratings column");
    } else {
      val values = lines.tail.map { x => x.split("\t") }
      val sorted = (values.sortBy[Float] { x => x(ratingColumn).toFloat }).map(x => x.mkString("\t"))
      printOutput(header, sorted) // Replace this with whatever you want to do with the sorted data.
    }

  }

  import scala.io._
  val now = new Date().getTime
  parseAndSortFile(Source.fromFile(fileName).getLines.toArray)
  println(new Date().getTime-now)

这应该减少内存的使用并加快排序速度。但是,由于您是在内存中排序,因此始终会限制最大大小。确保您的堆足够大。

我使用了2 GB的堆大小。

32 MB文件耗时16秒

65 mb文件耗时34秒

98 mb文件耗时61秒

注意:在进行计时时,注释掉对printOutput的调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在模式之间的文本文件中对行进行排序

在Java中对文本文件行进行排序

如何在python中按姓氏对文本文件中的行进行排序?

如何使用gedit按字母顺序对文本文件中的行进行排序

从文本文件中读取行,并通过将行中的值写入新的文本文件中来按均值(平均值)对行进行排序

文本文件中的Argparse自定义帮助

如何通过自定义功能对列表进行排序,并丢弃重复项?

如何使用文本文件中的数字对python中的文本文件进行排序

在Linux中使用特定的分隔符对文本文件中的行进行排序

按值对文本文件中的行进行排序

如何在自定义Unity3D Inspector中“ ping”文本文件?

如何在C ++中读取自定义格式的文本文件

对大型文本文件中的数据进行排序并将其转换为数组

对源自td中的自定义属性和文本的表行进行排序

如何根据自定义排序功能对 gsheet 表进行排序?

从 C# 中的文本文件读取自定义文本数据

在python中的文本文件中对值进行排序

我的自定义.desktop文件在Dash中显示为文本文件

如何在Python3中从文本文件获取和创建自定义变量?

如何按第一个单词对文本文件的行进行排序?

将文本文件内容写入Java中的自定义arraylist

C# / 排序文本文件 / IComparer / 自定义排序

如何通过自定义功能对熊猫DataFrame进行分组

如何在C中的文本文件中对记录进行排序?

如何按每行中的值对存储在文本文件中的条目进行排序

尝试使用一个功能的输出影响下一功能对文本文件中的单词进行计数

如何通过读取文本文件从 Scala 中的特定列中删除重复项

跳过文本文件中的特定行进行处理,但在输出中也返回这些行

如何使用python对文本文件中的键进行排序