c#如何读取20g以上的大文件

c#如何读取20g以上的大文件,第1张

在C#中读取20GB以上的大文件,建议使用流(Stream)来读取,以避免一次性加载整个文件到内存中而导致内存不足的问题。

以下是一种使用流来读取大文件的示例代码:

using (FileStream fs = new FileStream(@"C:\path\to\large\file.txt", FileMode.Open, FileAccess.Read))

{

using (BufferedStream bs = new BufferedStream(fs))

{

using (StreamReader sr = new StreamReader(bs))

{

string line

while ((line = sr.ReadLine()) != null)

{

// 处理每一行数据的逻辑

}

}

}

}

在这个代码示例中,我们使用了三个流对象:

FileStream:用于打开大文件并将其作为输入流

BufferedStream:用于加快数据的读取速度,通粗手过使用一个内部缓岩磨嫌存来减少对硬盘的读取次数

StreamReader:用于按行读取文本数据

在while循环中,我们可以处理每一行数据的逻辑。由于只读取了一行数据,因此内存占用较小,可以避免因为文件过大导致内存溢出的问题。

需要注意的是,在处理大文件时,为了保证性能,最好游基使用异步读取方式。这可以通过将StreamReader对象的ReadLine方法替换为异步版本ReadLineAsync来实现。

一、 TStream的常用的方法和属性:

1. function Read(var BufferCount: Longint): Longintvirtualabstract

2. function Write(const BufferCount: Longint): Longintvirtualabstract

3. function Seek(Offset: LongintOrigin: Word): Longintvirtualabstract

4. property Position: Longint

5. property Size: Longint

Read,Write,Seek都是纯虚函数,提供了数据读写和定位的抽象销嫌的方法。Read方法槐则将铅斗棚数据从Stream中读到Buffer缓冲区中,Write则实现相反的 *** 作,返回值表示实际读写数据的大小。Seek提供了在Stream中移动数据指针的方法。参数Origin可以取soFromBeginning,soFromCurrent,soFromEnd 三个值,Offset是偏移量,返回值是当前Stream数据指针的位置。

以文件流的形式打开文件之后有多种方法可以读取文件,这里列举常用的几种:

(1) size_t fread ( void   *buffer,  size_t size,  size_t count,  FILE *stream) 

功 能:从一个文件流中读庆游哪数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0。

参 数:

buffer:用于接收数据的内存地址,大小至少是size*count字节.

size:单个元素的大磨配小,单位是字节

count:元素的个数,每个元素是size字节.

stream:输入流(即打开文件返回的句柄)

返回值:实际读取的元素个数.如果返回值与count不相同,则可能文件结尾或发生错误.

从ferror和feof获取错误信息或检测是否到达文件结尾.

(2) 誉码char *fgets(char *buf, int bufsize, FILE *stream)

功能: 从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

参数:

buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明buf指向的字符数组的大小。

stream: 文件结构体指针,将要读取的文件流(即打开文件返回的句柄)

(3) int fgetc(FILE *stream)

功能:意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。

参数:

stream:输入文件流(即打开文件返回的句柄)

返回值:是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。

对于文本文件要逐行处理的可以优先考虑fgets()

若要逐个字符处理的可以优先考虑fgetc()

若对二进制文件或者整块数据进行处理的优先考虑fread()


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/8202238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存