BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

System.IO的新特性和性能改进

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 朱永光 关注 0 他的粉丝 发布于 2009年10月16日. 估计阅读时间: 2 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

微软打算为核心的System.IO功能提供一些简单却极受欢迎的性能改进。包括读写文本文件的便捷方法,快速地列举目录,对内存映射文件的支持。

第一个改进是,替换File.ReadAllLines这个原有的便捷方法。对于小文件而言,这是一个很好用的函数,但随着文件大小增大就会出现问题。根本的缺陷在于,ReadAllLines会暂停程序的运行直到整个文件都被读到字符串数组中。

替代的方法是File.ReadLines,其返回一个字符串枚举器。这种用延迟模式来读取文件方式,犹如使用低级的流对象一样。也为File.WriteAllLines和File.AppendAllLines提供了新的重载,两者可以接受枚举器而非数组作为参数。

DirectoryInfo.GetFiles具有同样的数组问题,不过它们还带来了更为严重的问题。在获取文件列表的时候,Win32 API也同时会返回诸如大小和最后编辑日期这样的基本信息。不幸的是,这些信息被.NET遗弃了,而由FileInfo对象来保存这些信息。所以,在程序开始遍历这些文件的时候,假设为了确定目录的总大小,就必须逐一重新查询文件系统。这就是一个经典的1+N优化问题。DirectoryInfo.GetFiles和新的DirectoryInfo.EnumerateFiles都修复了这个问题。

另外一个针对.NET的重要的性能改进是,对内存映射文件的支持。内存映射文件是把一块内存连接到一个文件的操作系统特性。一旦连接起来,你就能读写文件的任意部分,就像它已经不再是非托管内存数组了。操作系统会处理一些重要的细节问题,如把文件的不同部分分页到内存上,并在需要的时候从内存里提取出来。内存映射文件让应用程序可以操作非常庞大的文件,甚至上G的文件也可高效地处理。

另外,对于底层文件I/O,内存映射文件提供了强大的方法来与进程通信。如果两个应用程序打开了同一个内存映射文件,那么某个应用程序做出的改变会立即反映给另外一个应用程序。

尽管名称如此,内存映射文件并不需要一个真正的文件。它们可以是一些纯粹的内存对象,只要不用于后备存储。在应用程序内,这个潜在好处,特别适合于解决跨进程通信的问题。

查看英文原文:New Features and Performance Improvements for System.IO

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

以后操纵大文件就简单一些了 by im Kevin

以后操纵大文件就简单一些了

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT