我很驚訝,這會引發內存不足錯誤,因爲操作是在scala.collection.Iterator的頂部。各條線的尺寸小(< 1KB)令人驚訝的Scala迭代器「內存不足」錯誤
Source.fromFile("largefile.txt").getLines.map(_.size).max
似乎它試圖加載整個文件在存儲器中。不知道哪一步觸發了這一點。對於這樣的基本操作來說,這是令人失望的行爲。有沒有簡單的方法呢。這是由圖書館實施者設計的原因嗎?
在Java8中嘗試相同。
Files.lines(Paths.get("largefile.txt")).map(it -> it.length()).max(Integer::max).get
//result: 3131
而且這個工作可以預測。 Files.lines返回java.util.stream.Stream並且堆不會爆炸。
更新:看起來像歸結爲新的線解釋。兩個文件都被解釋爲UTF-8,並且它們都調用java.io.BufferedReader.readLine()。所以,仍然需要找出差異在哪裏。我將兩個片段主要類編譯到同一個項目jar中。
很多...文件大小比堆大小大。那不是重點。我認爲這不重要,因爲它是一個迭代器。 – smartnut007 2015-03-03 02:29:59
重現這個文件有多大?我只是在10 GB上運行,沒有任何問題。 – 2015-03-03 03:43:14
你確定*每行少於1KB?如果沒有任何換行符,那麼調用'_.size'將會生成一個非常大的'String'並且很快耗盡內存。 – 2015-03-03 03:53:10