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

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(使用前将#替换为@)

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

  • 不同提供商的相同 EDMX 文件

    我正在开发一个项目 其中有一个本地数据库 SQL CE 在不存在与服务器的连接的情况下用作缓冲区 在服务器上我想使用相同的数据库布局 当然 我想使用服务器和客户端上可用的 Common dll 中的相同 EDMX 文件 在客户端中 我有一个
  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 尽管浮点数相同,但它们并不相等? [复制]

    这个问题在这里已经有答案了 下面的程序输出This No is not same 当两个数字相同时为什么会这样做 void main float f 2 7 if f 2 7 printf This No is same else prin
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐

  • 用于检测用户是否单击 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