首页 > 代码库 > 使用 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()