首页 > 代码库 > 使用 System.IO 序列

使用 System.IO 序列

使用 System.IO 序列

 

F# 的一个有趣的能力是可以生成延迟序列(lazysequences,我们在第三章中讨论过),它可以用来处理大型文件,避免对文件预先分配的所有内存的开销,这样就能够处理那些太大而装不进 32 位系统的大型文件了。

生成序列非常简单,使用File.OpenText 方法,以文本文件流的形式打开文件。这个方法提供了一个流读取器(stream reader),使用 while 循环可以遍历文件内容:

 

// open a file path and create a lazystream from it

let allLinesSeq path =

let stream = File.OpenText(path)

seq { while not stream.EndOfStream do

yield stream.ReadLine() }

 

我们来快速看一下测试,看它是如何改进内存的性能的,使用性能计数器(performance counters)测量内存的消耗。性能计数器是测量和调整 Windows 性能的标准方法。Windows 有一个工具叫性能监视器(Performance Monitor,perfmon.exe),它能够观察性能计数器的值,也能够使用 .NET 框架中的类访问计数器的值,我们将通过这个测试进行讨论。

 

注意

也可以用 .NET 创建自定义的性能计数器,我曾经在一篇博客中有过描述,可以找一下,它在:

http://strangelights.com/blog/archive/2008/05/08/1615.aspx。

 

我们测量一下前一节讨论的File.ReadAllLines 方法的内存性能,使用 PerformanceCounter,创建 “Process, PrivateBytes”计数器的实例。在创建计数器之前最好测试一下,因为它随后可能引起垃圾回收(garbagecollection),会破坏测试结果:

 

open System.IO

open System.Diagnostics

 

// print out the contents of the file

let printFile () =

let lines =File.ReadAllLines("FieldingTomJones.txt")

Seq.iter (printfn "%s") lines

 

let main() =

// get the "Private Bytes"performance counter

let proc = Process.GetCurrentProcess()

let counter = newPerformanceCounter("Process",

"Private Bytes",

proc.ProcessName)

// run the test

printFile()

// print the result

printfn "All - Private bytes: %f"(counter.NextValue())

 

do main()