C#读取大文件
有些时候需要读取文件,小文件的时候效率的影响可以忽略,但是当文件上M,上G的时候,这个时候,效率问题就非常重要了,下面将对一个3G的文件,用C#的方式读取,对比效率的影响。
1. FileStream对象表示在磁盘或网络路径上指向文件的流,操作的是字节和字节数组,可以用于任何数据文件,而不仅仅是文本文件,也可以读取类似图像和声音的文件
2. BufferedStream类主要用来处理流数据的,减少某些流直接操作存储设备的时间,提高读写效率,也可以读取字节,当读取文件的时候,用字节读取有可能会把字符分开,最后转换而成的字符可能就有问题。
3. StreamReader,StreamWriter 类操作的是字符数据,一般用于读写文件
#FileMode
1. Create:创建新文件;如果存在这样的文件,将重写
2. CreateNew:创建新文件,但是如果已经存在此文件,则抛出异常
3. Open:打开现有的文件,但是不存在所指定的文件,则抛出异常
4. OpenOrCreate:如果文件存在,则规定打开文件,否则就创建新文件
5. Truncate:打开现有文件,清除其内容
6. Append:如果文件存在,就打开文件,将文件位置移动到文件的末尾,否则创建一个新文件。
以下代码是在.net core环境下运行的
Stopwatch watch = new Stopwatch();
watch.Restart();
using (StreamWriter newFile = new StreamWriter(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\big4.txt"))
using (StreamReader reader = new StreamReader(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
newFile.WriteLine(line);
}
}
watch.Stop();
Console.WriteLine($"StreamReader StreamWriter 程序运行花费的时间:{(double)watch.ElapsedMilliseconds / 1000:0.000} secs"); watch.Restart();
int length = ;
byte[] array = new byte[length];
int bytesRead = ;
using (FileStream fileStream = new FileStream(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test.txt", FileMode.Open))
using (FileStream newFile = new FileStream(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test5.txt", FileMode.Create))
using (BufferedStream bufferedStream = new BufferedStream(fileStream))
{
while ((bytesRead = bufferedStream.Read(array, , length)) > )
{
if (bytesRead == length)
newFile.Write(array);
else
newFile.Write(array, , bytesRead);
}
}
watch.Stop();
Console.WriteLine($"BufferedStream FileStream 程序运行花费的时间:{(double)watch.ElapsedMilliseconds / 1000:0.000} secs"); watch.Restart();
using (FileStream fileStream = new FileStream(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test.txt", FileMode.Open))
using (StreamWriter newFile = new StreamWriter(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test6.txt"))
using (BufferedStream bufferedStream = new BufferedStream(fileStream))
using (StreamReader reader = new StreamReader(fileStream))
{
string line;
while ((line = reader.ReadLine()) != null)
{
newFile.WriteLine(line);
}
}
watch.Stop();
Console.WriteLine($"StreamReader StreamWriter(结合BufferedStream) 程序运行花费的时间:{(double)watch.ElapsedMilliseconds / 1000:0.000} secs");
没有读写文件的计算机性能

读写文件的时候计算机性能

当读写文件的时候,CPU和磁盘使用率提高,如果服务器经常读写文件的话,需要好的CPU和硬盘
3G的文件读写运行效率对比

小文件运行效率对比

对比以上结果,读取字节效率最高,增加BufferedStream的时候效率要比不增加的时候快
C#读取大文件的更多相关文章
- PHP如何快速读取大文件
在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...
- java读取大文件
1 多线程 2 java内存映射读取大文件
- php使用file函数、fseek函数读取大文件效率分析
php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...
- Java多线程读取大文件
前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...
- PHP读取大文件的几种方法介绍
读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办 ...
- Java 读取大文件方法
需求:实际开发中读取文本文件的需求还是很多,如读取两个系统之间FTP发送文件,读取后保存到数据库中或日志文件的数据库中保存等. 为了测试首先利用数据库SQL生成大数据文件. 规则是 编号|姓名|手机号 ...
- Java高效读取大文件
1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...
- Python逐块读取大文件行数的代码 - 为程序员服务
Python逐块读取大文件行数的代码 - 为程序员服务 python数文件行数最简单的方法是使用enumerate方法,但是如果文件很大的话,这个方法就有点慢了,我们可以逐块的读取文件的内容,然后按块 ...
- Java高效读取大文件(转)
1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读 ...
- Python读取大文件的"坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...
随机推荐
- palindrome-partitioning I&II——回文切割、深度遍历
I: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...
- 机器学习技法总结(六)Decision Tree Hypothesis
这里先再次提出我们利用aggregation获取更好性能的Hypothesis G所涉及的方法:blending,就是在得到g_set之后进行融合:learning呢?就是在线online的获取g并融 ...
- zedboard中OLED源码
#include <stdio.h> #include "platform.h" #include "xil_types.h" #include & ...
- SpringBoot学习之@SpringBootApplication注解
下面是我们经常见到SpringBoot启动类代码: @SpringBootApplicationpublic class DemoApplication extends SpringBootServl ...
- js团购倒计时函数代码
<h1>团购啦!</h1><p>还剩<span id="times"></span></p> <SCR ...
- JQUERY多选框,单选框,检查选中的值
var str=""; $(":checkbox:checked").each(function(){ if($(this).attr("checke ...
- 重构机房收费系统你要用的——异常处理和抛出异常(try catch finally)——(vb.net)
你能保证你的程序不会出问题吗? 不能 当你的程序执行到某个地方发生了你不想要的结果.你是否想让它一错再错? 不想 你是否想让你的程序占着茅坑不拉屎? 不想 你是否想知道你的程序出错的原因? 想 个问题 ...
- iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例
iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例 使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWReveal ...
- ORA-01031: insufficient privileges 解决办法
sysdba不能远程登录这个也是一个很常见的问题了. 碰到这样的问题我们该如何解决呢? 我们用sysdba登录的时候,用来管理我们的数据库实例,特别是有时候,服务器不再本台机器,这个就更是有必要了. ...
- spring cloud 启动报错-must be declared as an @AliasFor [serviceId], not [name].
项目加入FeignClient后再启动就报错,具体报错信息如下: org.springframework.core.annotation.AnnotationConfigurationExceptio ...