尽可能快地打开和读取数千个文件

2024-02-12

我需要尽快打开和读取数千个文件。

我对 13 592 个文件进行了一些测试,发现方法 1 比方法 2 稍快。这些文件通常在 800 字节到 4kB 之间。我想知道是否可以做些什么来使这个 I/O 密集的过程更快?

Method 1:
    Run 1: 3:05 (don't know what happened here)
    Run 2: 1:55
    Run 3: 2:06
    Run 4: 2:02
Method 2:
    Run 1: 2:04
    Run 2: 2:08
    Run 3: 2:04
    Run 4: 2:12

这是代码:

public class FileOpenerUtil
{

    /// <summary>
    /// 
    /// </summary>
    /// <param name="fullFilePath"></param>
    /// <returns></returns>
    public static string ReadFileToString(string fullFilePath)
    {
        while (true)
        {
            try
            {
                //Methode 1
                using (StreamReader sr = File.OpenText(fullFilePath))
                {
                    string fullMessage = "";
                    string s;
                    while ((s = sr.ReadLine()) != null)
                    {
                        fullMessage += s + "\n";
                    }
                    return RemoveCarriageReturn(fullMessage);
                }
                //Methode 2
                /*using (File.Open(fullFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    Console.WriteLine("Output file {0} ready.", fullFilePath);
                    string[] lines = File.ReadAllLines(fullFilePath);
                    //Every new line under the previous line
                    string fullMessage = lines.Aggregate("", (current, s) => current + s + "\n");
                    return RemoveCarriageReturn(fullMessage);
                    //ninject kernel


                }*/
                //Methode 3

            }
            catch (FileNotFoundException ex)
            {
                Console.WriteLine("Output file {0} not yet ready ({1})", fullFilePath, ex.Message);
            }
            catch (IOException ex)
            {
                Console.WriteLine("Output file {0} not yet ready ({1})", fullFilePath, ex.Message);
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine("Output file {0} not yet ready ({1})", fullFilePath, ex.Message);
            }
        }

    }

    /// <summary>
    /// Verwijdert '\r' in een string sequence
    /// </summary>
    /// <param name="message">The text that has to be changed</param>
    /// <returns>The changed text</returns>
    private static string RemoveCarriageReturn(string message)
    {
        return message.Replace("\r", "");
    }
}

我正在读取的文件是 .HL7 文件,如下所示:

MSH|^~\&|OAZIS||||20150430235954||ADT^A03|23669166|P|2.3||||||ASCII EVN|A03|20150430235954||||201504302359 PID|1||6001144000||姓氏^名字^^^Mevr.|姓氏^名字|19600114|F|||GS街道名称号码^^城市^^邮政编码^B^H||09/3444556^^PH~0476519246echtg^ ^CP||NL|M||28783409^^^^VN|0000000000|60011402843||||||B||||N PD1||||003847^姓氏^名字||||||||N|||0 PV1|1|O|FDAG^000^053^001^0^2|NULL||FDAG^000^053^001|003847^姓氏^名字||006813^姓氏^名字|1900|00||||| |006813^姓氏^名字|0|28783409^^^^VN|1^20150430|01||||||||||||||1|1||D|||||201504301336|201504302359 OBX|1|CE|KIND_OF_DIS|RCM|1^1 手术医疗建议 OBX|2|CE|DESTINATION_DIS|RCM|1^1 Terug naar huis

打开文件后,我用以下命令解析字符串j4jayant 的 HL7 解析器 https://github.com/j4jayant/hl7-cSharp-parser/tree/master/j4jayant.HL7.Parser并关闭文件。


我使用了 50,000 个不同大小的文件(500 到 1024 字节)。

Test 1: 你的方法1StreamReader sr = File.OpenText(fullFilePath); sr.ReadLine();
秒:3,4658937968113
Test 2: 你的方法2File.ReadAllLines(fullFilePath)
秒:5,5008349279222
Test 3: File.ReadAllText(fullFilePath);
秒:3,30782645637133
Test 4: BinaryReader b = new BinaryReader; b.ReadString();
秒:5,85779941381009
Test 5: Windows FileReader (https://msdn.microsoft.com/en-us/library/2d9wy99d.aspx https://msdn.microsoft.com/en-us/library/2d9wy99d.aspx)
秒:3,07036554759848
Test 6: StreamReader sr = File.OpenText(fullFilePath); sr.ReadToEnd();
秒:3,31464109255517
Test 7: StreamReader sr = File.OpenText(fullFilePath); sr.ReadToEnd();
秒:3,3364683664508
Test 8: StreamReader sr = File.OpenText(fullFilePath); sr.ReadLine();
秒:3,40426888695317
Test 9:文件流+缓冲流+流读取器
秒:4,02871911079061
Test 10: Parallel.For using code File.ReadAllText(fullFilePath);
秒: 0,89543632235447

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽可能快地打开和读取数千个文件 的相关文章

  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • 选择列表逻辑应位于 ASP.NET MVC、视图、模型或控制器中的什么位置?

    我觉得我的问题与这个问题很接近 但我想对这样的代码应该放在哪里进行更一般的讨论 Asp Net MVC SelectList 重构问题 https stackoverflow com questions 2149855 asp net mv
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • 用于检测用户是否单击 XFBML 页面中的“喜欢”按钮的事件处理

    我有一个 Facebook 连接应用程序 画布 IFrame 应用程序 其中有一个Like控制粉丝专页 我想检测用户何时单击Like按钮能够显示附加信息 折扣优惠券代码 我用的是最新的JavaScript API http develope
  • PouchDb - 删除文档内的对象

    我是一名意大利 PouchDb 和 AngularJS 开发人员 我的 json 文档是 id 6 rev 3 f7283d7683cd6fb15753f494aad1d49f name Ivrea owners owner id 1 na
  • angular.forEach 和对象

    问题 我正在做 我认为是但也许不是 一个简单的angular forEach在数组上然后使用 resource根据返回的每个值进行调用 正如我所期望的 每次调用的结果都是一个对象 但是 我无法让这些对象以angular forEach 文档
  • JavaScript-如何在不使用 charAt 方法的情况下返回该索引处的字符

    我有一个接受两个参数字符串和索引的函数 如何编写一段代码 在不使用 javascript 内置方法 charAt 的情况下返回该索引处的字符 例如 getIndex great 1 应该返回 r 创建函数如下 function getInd
  • 当 Markdown 包含水平线时,“生成 PDF 时出错”: --- 或 ***

    当我的 Markdown 文件包含水平线 或 时 我收到有关 Linethickness gt Protect 的错误 我知道最近 MiKTeX 出现了问题 但我不确定它们是否适用于此 从昨天早上开始 我就一直遇到这个问题 当时我正在尝试让
  • Android 底部导航 Activity 在 onCreate 中出现空指针异常

    我向我的项目添加了一个底部导航活动 但是当我启动相关活动时 它给出了空指针异常 它说异常是在第 28 行触发的 在 lk apiit eea mobile Activities CompanyProfile onCreate Company
  • PHP:获取关联数组的第n项

    如果你有一个关联数组 Array uid gt Marvelous status gt 1 set later gt Array 0 gt 1 1 gt 0 op gt Submit submit gt Submit 如果您想访问第二项 您
  • 在特定桌面上启动进程

    如何在特定的 Windows 桌面上启动 Windows 进程 最好 我们正在寻找一种在 Windows 8 1 上也支持的解决方案 即不依赖于 Windows 10 的新任务视图功能 我知道 用户在 Windows 8 1 中不容易访问不
  • 使用 Backbone Marionette 使用现有渲染的 HTML 显示视图

    我有一个像所附的应用程序布局 上面的面板已经到了页面 即在服务器的 HTML 响应中 当用户与该面板中的元素交互时 下面的动态面板的内容会相应地发生变化 我研究了 Backbone Marionette 的各种视图类型和区域管理器 但我仍然
  • 更改 OS X 菜单栏中 Tkinter 应用程序的标题

    当您在 Python 中使用 Tkinter 创建带有 GUI 的应用程序时 应用程序的名称在 OS X 的菜单栏中显示为 Python 如何才能让它显示为其他内容 我的答案是基于埋在中间的一个一些论坛 http compgroups ne
  • statespace.SARIMAX模型:为什么模型使用所有数据来训练模式,并预测训练模型的范围

    我按照教程研究了SARIMAX模型 https www digitalocean com community tutorials a guide to time series forecasting with arima in python
  • Dagger 2 活动注入不起作用

    我正在尝试新的 dagger 2 这是我第一次实现它 但我无法让它工作 我想我已经明白了这个概念并且理解了这个例子here https github com LiveTyping u2020 mvp 我尝试复制相同的结构 只是针对我的示例进
  • Java Process.waitFor() 和 Readline 挂起

    首先 这是我的代码 import java io import java util Date import com banctecmtl ca vlp shared exceptions public class PowershellTes
  • elasticsearch有复合索引吗?

    我想知道elasticsearch是否需要预先定义复合索引 通过复合索引 我的意思是类似于 mongodb 的东西 db collection ensureIndex 字段1 1 字段2 1 字段3 1 或者类似于 mysql db 的东西
  • 有什么方法可以控制 NavigationView 标头内的视图吗?

    正如标题所说 我想知道是否有什么方法可以控制内部的视图NavigationView标题 添加或删除标头除外 例如 在标题中 我有一个用户头像 默认情况下 它显示访客图像 但用户登录后 将显示真实头像 如何才能做到这一点 将支持库更新到版本
  • 如何在单个视图中实现两个片段?

    我有一个包含 3 个片段的应用程序 而且viewpager 工作得很好 但我需要像 Android Play 商店中那样实现类似的视图 最初他们有 特色 选项卡 当您向左滑动时 我们可以看到 类别 选项卡 但一半的屏幕仍然充满了 精选 选项
  • 在单独的线程中运行异步循环,信号来自和循环

    我正在尝试制作一个在后台与多个 BLE 设备进行通信的 UI 为此 我实现了一个运行 asyncio loop 的单独线程 这是必要的 因为我使用 bleak 0 9 1 连接到设备 使用信号和槽将数据从 UI 线程获取到工作线程效果很好
  • iOS 5.1 和 Xcode 4.3.1 CodeSign 错误

    我刚刚下载了 iOS 5 1 和 Xcode 4 3 1 但是当我要在我的设备中进行测试时 Xcode 给出了错误 CodeSign 错误 SDK iOS 5 1 中的产品类型 应用程序 需要代码签名 知道如何修复它吗 尝试在每个字段中分配
  • 管理 web.config 文件

    我有 3 个环境 NET 4 上的 Dev QA Prod 每个环境都有一个唯一的 web config 文件 我们在管理所有三个版本时遇到了问题 在 TFS 中手动合并 web config 文件时 很容易忽略一些关键的东西 我们不止一次
  • 尽可能快地打开和读取数千个文件

    我需要尽快打开和读取数千个文件 我对 13 592 个文件进行了一些测试 发现方法 1 比方法 2 稍快 这些文件通常在 800 字节到 4kB 之间 我想知道是否可以做些什么来使这个 I O 密集的过程更快 Method 1 Run 1