文档章节

在C#中将大文件读入字节数组的最佳方法是什么?

 技术盛宴
发布于 02/19 21:37
字数 711
阅读 104
收藏 0

我有一个Web服务器,它将大型二进制文件(几兆字节)读入字节数组。 服务器可能同时读取多个文件(不同的页面请求),所以我正在寻找最优化的方法来做到这一点,而不会对CPU造成过多的负担。 下面的代码是否足够好?

public byte[] FileToByteArray(string fileName)
{
    byte[] buff = null;
    FileStream fs = new FileStream(fileName, 
                                   FileMode.Open, 
                                   FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    long numBytes = new FileInfo(fileName).Length;
    buff = br.ReadBytes((int) numBytes);
    return buff;
}

#1楼

只需用以下内容替换整个内容:

return File.ReadAllBytes(fileName);

但是,如果您担心内存消耗, 则不应该一次性将所有文件都读入内存。 你应该以大块的方式做到这一点。


#2楼

我会这样想:

byte[] file = System.IO.File.ReadAllBytes(fileName);

#3楼

您的代码可以考虑到这一点(代替File.ReadAllBytes):

public byte[] ReadAllBytes(string fileName)
{
    byte[] buffer = null;
    using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        buffer = new byte[fs.Length];
        fs.Read(buffer, 0, (int)fs.Length);
    }
    return buffer;
} 

请注意Integer.MaxValue - Read方法放置的文件大小限制。 换句话说,您一次只能读取2GB的块。

另请注意,FileStream的最后一个参数是缓冲区大小。

我还建议阅读有关FileStreamBufferedStream的内容

一如既往的简单示例程序,以最快的速度分析将是最有益的。

您的底层硬件也会对性能产生很大影响。 您是否使用具有大缓存的服务器硬盘驱动器和带有板载内存缓存的RAID卡? 或者您使用连接到IDE端口的标准驱动器?


#4楼

使用C#中的BufferedStream类来提高性能。 缓冲区是内存中用于缓存数据的字节块,从而减少了对操作系统的调用次数。 缓冲区可提高读写性能。

有关代码示例和其他说明,请参阅以下内容: http//msdn.microsoft.com/en-us/library/system.io.bufferedstream.aspx


#5楼

我可能会争辩说这里的答案通常是“不要”。 除非您绝对需要同时使用所有数据,否则请考虑使用基于Stream的API(或读取器/迭代器的某些变体)。 当您有多个并行操作(如问题所示)以最小化系统负载和最大化吞吐量时,这一点尤为重要。

例如,如果要将数据流式传输给调用者:

Stream dest = ...
using(Stream source = File.OpenRead(path)) {
    byte[] buffer = new byte[2048];
    int bytesRead;
    while((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0) {
        dest.Write(buffer, 0, bytesRead);
    }
}

本文转载自:https://stackoom.com/question/8WJb/在C-中将大文件读入字节数组的最佳方法是什么

粉丝 0
博文 1595
码字总数 0
作品 0
深圳
高级程序员
私信 提问
加载中

评论(0)

OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream

一.OutputStream 类(java.io) 概述:OutputStream类就是专门用于从程序中将数据写入到介质中; 定义:public abstract class OutputStream extends Object implements Closeable, Flushable Ou......

老胡2015
2017/06/22
0
0
8-Java常用工具类-输入输出流

Java输入输出流 生活中无处不在,只要涉及到传输。复制粘贴操作;修改头像,将本地数据上传到网络服务器。 将字符串输出到屏幕上。 字符从河流中依次通过,形成了字符流。 流就是指一连串流动...

天涯明月笙
2018/08/09
0
0
在Java中将InputStream转换为字节数组

如何将整个读入字节数组? #1楼 您需要从读取每个字节并将其写入 。 然后,您可以通过调用来检索基础的字节数组; 例如 #2楼 您可以使用Apache Commons IO处理此任务和类似任务。 类型具有静...

javail
2019/12/18
42
0
IO _ InputStream

InputStream:输入流,实现Closeable接口; publlic abstract class InputStream extends Ojbect implements Closeable 该抽象类表示字节输入流的所有类的超类,需要定义InputStream子类的应用...

键盘小生
2013/02/25
70
0
C语言文件的读入与写入及C#基础函数学习[图]

C语言文件的读入与写入及C#基础函数学习[图] 学了一学期的C语言,还不怎么会使用指针,文件的读入和写入也不能很顺利的写出来,说起来好惭愧。碰巧今天朋友让我帮他编写一个C语言程序,对他数...

原创小博客
2018/08/04
34
0

没有更多内容

加载失败,请刷新页面

加载更多

如何仅克隆Git存储库的子目录? - How do I clone a subdirectory only of a Git repository?

问题: I have my Git repository which, at the root, has two sub directories: 我有我的Git存储库,它的根目录有两个子目录: /finisht/static When this was in SVN , /finisht was ch......

技术盛宴
19分钟前
26
0
【 开发指南 】智能家居技能

本文作者:DuerOs 目录 一、教学视频 二、整体架构 三、开发步骤&资料整理 四、常见问题解答 五、智能家居文档 树状提纲 ————————————————————————————————...

百度开发者中心
2019/03/29
61
0
008. 并发容器类 Map

1. JDK 源码学习方法 1. 演绎推导法 示例:因果推理。 因为 JAVA 中只提供了 BIO 和 NIO 两种方式,所以一切框架中,涉及到网络处理的,都可以用这两个知识点去探究原理。 2. 归纳总结法 示例...

紫穹
今天
106
0
如何使用sed替换换行符(\\ n)? - How can I replace a newline (\n) using sed?

问题: How can I replace a newline (" \\n ") with a space (" 如何将换行符(“ \\n ”)替换为空格(“ ") using the sed command? “)使用sed命令? I unsuccessfully tried: 我尝试失......

javail
今天
121
0
OSChina 周一乱弹 —— 原来这叫分别焦虑

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《A Careful Tearing》- Levi Patel 手机党少年们想听歌,请使劲儿戳(这里) 清明...

小小编辑
今天
221
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部