大文本文件的高效迭代
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)
这里我们一次索引一行,因为我们只对文件进行一次迭代。
【讨论】:
以上是关于大文本文件的高效迭代的主要内容,如果未能解决你的问题,请参考以下文章