使用 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()

使用 System.IO 序列

时间: 2024-08-10 08:11:17

使用 System.IO 序列的相关文章

命名空间System.IO

基本介绍:System.IO 命名空间提供读写文件和数据流的类型.基本文件和目录支持的类型. 原文:http://blog.sina.com.cn/s/blog_48a45b950100erhz.html http://edu.cnzz.cn/201510/977513da.shtml 主要的类 字节流:Stream.BufferedStream.MemoryStream.UnmanagedMemoryStream.FileStream 二进制IO流:BinaryReader和BinaryWri

System.IO.Pipelines: .NET上高性能IO

System.IO.Pipelines是一个新的库,旨在简化在.NET中执行高性能IO的过程.它是一个依赖.NET Standard的库,适用于所有.NET实现. Pipelines诞生于.NET Core团队,为使Kestrel成为业界最快的Web服务器之一.最初从作为Kestrel内部的实现细节发展成为可重用的API,它在.Net Core 2.1中作为可用于所有.NET开发人员的最高级BCL API(System.IO.Pipelines)提供. 它解决了什么问题? 为了正确解析Strea

System.IO.File.Create 不会自动释放,一定要Dispose

这样会导致W3P进程一直占用这个文件 System.IO.File.Create(HttpContext.Current.Server.MapPath(strName)) 最好加上Dispose System.IO.File.Create(HttpContext.Current.Server.MapPath(strName)).Dispose()

System.IO 命名空间

System.IO 命名空间的主要目的是为了提供方便访问操作系统的文件和目录类型,另外,也提供写内存和网络流的方法. 这个命名空间提供主要两种方法处理文件和目录,能够使用FileInfo 和 DirectoryInfo 对象获得或修改文件和目录的信息:也能够用File 和 Directory 类实现相同的功能,但是两者都要求传入的文件名为静态成员.通常,如果想要获得文件系统对象的某一项信息,用 File 和 Directory 类:如果想要获得一个文件系统对象的多项信息,用 FileInfo 和

System.IO 二

接着上篇的来  System.IO FileSystemWatcher    指向这个签名的方法   可以监听目录发生了什么事件 例如: static void Main(string[] args) { Console.WriteLine("请开始你的表演:"); FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = @"E:\Test"; //此目录一定需要存在,不然会引发 Arg

System.IO.Path 文件名、路径、扩展名 处理

string filePath [email protected]"E:/Randy0528/中文目录/JustTest.rar"; 更改路径字符串的扩展名.System.IO.Path.ChangeExtension(filePath, "txt");E:/Randy0528/中文目录/JustTest.txt 返回指定路径字符串的目录信息.System.IO.Path.GetDirectoryName(filePath);E:/Randy0528/中文目录 返回

system.io.file创建

在实际开发中,如果用的文件名不能确定位置.或名字.可以使用GUID类来命名函数.Guid 结构标识全局唯一标示符.其NewGuid结构可以初始化一个新历.该方法语法格式如下: public static Guid NewGuid(); return: 初始化后的实例. 源码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dr

关于 System.IO.FileAttributes 的 Reparse Points

关于Reparse Points找到下面的解释,要是能有更进一步的解释说明就更好了 Reparse Points其实是一个用户自定义的数据集合,它可以包含在一个文件或目录中.这种格式的数据能够被特定的应用程序(负责存储数据)和文件系统过滤程序(负责解释数据和处理文件)所理解.当一个应用程序设置了一个再解析点时,它存储这个数据和再解析标记(唯一标识该数据).当文件系统打开一个含有再解析点的文件时,它会尝试找到再解析标记所标识的文件系统过滤程序.如果文件系统过滤程序被发现,该文件系统过滤程序处理该文

目录操作-SYSTEM.IO

using System; using System.Data; using System.Text; using System.IO; namespace TestApp { class Program { static void Main() { DataSet ds = new DataSet("carRepairs"); string path = Environment.CurrentDirectory; path = Directory.GetParent(path).Fu