大文本文件的高效迭代

Posted

技术标签:

【中文标题】大文本文件的高效迭代【英文标题】:Efficient iteration of large text file 【发布时间】:2017-11-23 09:29:07 【问题描述】:

所以我有以下内容:

val bufferedSource = io.Source.fromFile("""C:\Users\something\workspace\""" + fileName)
val lines = bufferedSource.getLines

我想随机选择一个开始索引和一个结束索引,并在打印到新文件时在此范围内迭代lines。有没有办法通过索引访问lines迭代器中的元素?

我的第一次尝试是将数据复制到ListBuffer

var lineArr = ListBuffer[String]()
for (line <- lines) 
    lineArr += line

Therafter 如果我在我的范围内遍历lineArr,按索引,它真的很慢。

我怎样才能有效地做到这一点?

旁注:如果我遍历包含所有元素(我不想要的)的lines,则在将它们写入新文件时进行迭代会很快,但是我只想写入一个选择量。

【问题讨论】:

【参考方案1】:

所以我没有遍历每一行,而是使用切片解决了这个问题。我仍然创建了一个ListBuffer,但我在开始和结束索引上对其进行了切片:

lineArrTemp = lineArrTemp.slice(start, end)

然后简单地遍历 ListBuffer 迭代器,它是有效的。

【讨论】:

lineArrTemp.iterator().slice(start, end) 更好。无需创建中间ListBuffer。或者您可以使用ArrayBuffer,其中slice(但不是iterator().slice)会更有效。【参考方案2】:
  lines
    .drop(startIndex)
    .take(endIndex - startIndex)
    .foreach(writeToFile)

【讨论】:

【参考方案3】:

还要考虑迭代器上的zipWithIndex,因此我们可以根据索引值进行复杂的行选择;例如用

选择偶数索引行
io.Source.fromFile("temp.txt").getLines.zipWithIndex.foreach  
  case (line,i) => if (i % 2 == 0) println(line) 

这里我们一次索引一行,因为我们只对文件进行一次迭代。

【讨论】:

以上是关于大文本文件的高效迭代的主要内容,如果未能解决你的问题,请参考以下文章

python大文件处理

python 输出大文本文件

在python中逐行迭代一个大的.xz文件

如何提高java读取大文本文件的效率

迭代文本文件中的数字

Python3读取大文件的方法