C#流Stream与IO详解(4)——如何更快的读写文件

2023-09-22 08:54:23

【前言】

在我们追求更快读写速度时,通常都是为了读写二进制文件,而不是文本文件,所以这里只说FileStream、BinaryReader、BinaryWriter的使用。

从前文的源码解读中能看到使用BinaryReader和BinaryWriter进行IO读写时本质还是调用了FileStream的接口,所以我们这里只说FileStream的使用即可。

此外,我们这里说的更快读写是指在同一个线程中的读写,而不是使用多线程读写。

【打开关闭文件】

打开和关闭文件是非常耗时的操作,有如下优化方式:

1.如果只需要读写一个文件,但需要在多个地方读写文件,应该持有同一个FileStream,而不是每次new一个FileStream

2.如果要读写很多文件,应该先创建一系列的FileStream,而不是每次需要的时候再创建FileStream。

【读写文件】

 FileStream自己有个Buffer,读写数据时要避免使用这个buffer,因为会多一次copy,这个buffer的大小默认为4kb(可以在new的时候自定义大小),自己指定的Array的大小要大于或等于4kb。因此,优化措施如下:

1.每次读取文件的大小至少为4kb,即使你实际并不需要4kb的大小,然后从自己指定的Array中获取想要的数据。即使文件大小不足4kb,自己指定的Buffer的大小也要为4kb。

2.写入数据时凑足4kb再写入,如果数据不足4kb,可以补充些无用的数据到4kb,或者将buffersize设置的小点

3.如果需要同时读写,不要交叉读写。

【寻找位置】

从前文的源码可以知道,在寻找位置时,可能存在Copy的步骤,为了加快寻找位置,同样需要在读写数据时要避免使用FileStream的buffer

更多推荐

Spring Cloud Alibaba

单体应用优点:1、系统的简易性:系统语言风格、业务结构,接口格式均具有一致性,服务都是耦合在一起的,不存在各个业务通信问题。2、易于测试:单体应用一旦部署,所有的服务或特性就都可以使用了,简化了测试过程,无需额外测试服务间的依赖,测试均可在部署完成后开始。3、易于部署与升级:相对于微服务架构中的每个服务独立部署,单体系

Java基础面试题精选:深入探讨哈希表、链表和接口等

目录1.ArrayList和LinkedList有什么区别?🔒2.ArrayList和Vector有什么区别?🔒3.抽象类和普通类有什么区别?🔒4.抽象类和接口有什么区别?🔒5.HashMap和Hashtable有什么区别?🔒6.HashMap底层是如何实现的?🔒7.HashMap和HashSet有什么区别

【每日一题Day330】LC337打家劫舍Ⅲ | 动态规划

打家劫舍Ⅲ【LC337】小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root。除了root之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。给定二叉树的root。返回在

基于开源模型搭建实时人脸识别系统(六):人脸识别(人脸特征提取)

文章目录人脸识别的几个发展阶段基于深度学习的人脸识别技术的流程闭集和开集(Openset)识别人脸识别的损失Insightface人脸识别数据集模型选型参考文献结语人脸识别系统项目源码前面我们讲过了人脸检测、人脸质量、人脸关键点、人脸跟踪,接下来就是人脸识别系统里面的重中之重人脸识别了,或者叫人脸特征提取,这个算法是来

深入JVM:探索Java虚拟机

文章目录1.JVM简介1.1定义与核心作用1.2JVM的跨平台特性2.JVM内部结构深度探索2.1类加载机制2.1.1双亲委派模型2.1.2OSGI框架2.1.3类加载器分类2.2JVM运行时数据区2.2.1程序计数器2.2.2本地方法栈2.2.3Java虚拟机栈2.2.4堆2.2.5元数据区2.3JVM内存区域的性能

论文阅读 Extended Feature Pyramid Network for Small Object Detection

ExtendedFeaturePyramidNetworkforSmallObjectDetectionAbstract小目标检测仍然是一个未解决的挑战,因为仅凭几个像素很难提取小目标的信息。虽然特征金字塔网络中的scale-levelcorrespondingdetection减轻了这个问题,但我们发现不同尺度的特征

C++:constexpr 和 const 的区别

constexpr是C++11标准新添加的关键字,原先的标准中是只有const关键字的,作用是表示只读常量。但是,其实只读常量是两个属性,分为只读和常量,都用const来表示会产生歧义。看下面的例子#include<iostream>#include<array>usingnamespacestd;constintfu

代码随想录算法训练营第23期day2 | 977.有序数组的平方 、209.长度最小的子数组、59.螺旋矩阵II

目录一、(leetcode977)有序数组的平方1.暴力解法2.双指针法二、(leetcode209)长度最小的子数组1.暴力解法​编辑2.滑动窗口三、(leetcode59)螺旋矩阵II一、(leetcode977)有序数组的平方力扣题目链接1.暴力解法状态:已ACclassSolution{public:vecto

系统稳定性保障设计总结和思考

一、架构层面不同的系统在不同的业务发展阶段,对系统会有不同的考察指标,进行架构设计和技术选型更多是一种权衡和折中的选择,如何进行存储方案选型?是选择Mysql这类OLTP数据库还是MPP型OLAP数据仓库。如何进行消息队列选型?是选择可靠性更强的RabbitMQ还是还是轻松吞吐百万流量的Kafka,这些都是需要根据具体

docker 数据持久化

文章目录定制镜像持久化需求实现数据卷持久化数据卷简介数据卷的特性创建读写数据卷停止容器后的操作查看数据卷详情创建只写数据卷查看数据卷详情创建共享数据卷Dockerfile持久化创建Dockerfile、构建和运行镜像查看宿主机端的目录在容器层的UnionFS(联合文件系统)中对文件/目录的任何修改,无论是手工修改还是容

【CCF】第30次csp认证——202305-1重复局面

202305-1重复局面:问题描述国际象棋每一个局面可以用大小为8×8的字符数组来表示,其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母k、q、r、b、n、p表示,其中大写字母对应白方、小写字母对应黑方。棋盘上无棋子处用字符*表示。两个字符数组的每一位均相同则说明对应同一局面。现已按上述方式整理

热文推荐