使用c在linux上分块读写

2024-05-27

我有一个 ASCII 文件,其中每一行都包含一个可变长度的记录。例如

Record-1:15 characters
Record-2:200 characters
Record-3:500 characters
...
...
Record-n: X characters

由于文件大小约为 10GB,我想分块读取记录。一旦读取,我需要转换它们,将它们以二进制格式写入另一个文件。

因此,为了阅读,我的第一反应是创建一个 char 数组,例如

FILE *stream; 
char buffer[104857600]; //100 MB char array
fread(buffer, sizeof(buffer), 104857600, stream);
  1. linux 将发出一个系统调用并获取整个 100MB 的假设是否正确?
  2. 由于记录由换行符分隔,因此我在缓冲区中逐个字符搜索新行字符并重建每个记录。

我的问题是,我应该如何分块读取数据,或者是否有更好的替代方法来分块读取数据并重建每个记录?是否有另一种方法可以在一次调用中从 ASCII 文件中读取 x 个可变大小的行?

接下来在写作过程中,我也会这样做。我有一个写入字符缓冲区,我将其传递给 fwrite 以在一次调用中写入一整套记录。

fwrite(buffer, sizeof(buffer), 104857600, stream);

更新:如果我 setbuf(stream, buffer),其中 buffer 是我的 100MB 字符缓冲区,fgets 是否会从缓冲区返回或导致磁盘 IO?


  1. Yes, fread将立即获取整个内容。 (假设它是一个普通文件。)但是它不会读取 105 MB,除非文件本身是 105 MB,并且如果您不检查返回值,您将无法知道实际读取了多少数据,或者是否存在是一个错误。

  2. Use fgets (see man fgets) 代替fread。这将为您搜索换行符。

    char linebuf[1000];
    FILE *file = ...;
    while (fgets(linebuf, sizeof(linebuf), file) {
        // decode one line
    }
    
  3. 您的代码有问题。

    char buffer[104857600]; // too big
    

    如果您尝试在堆栈上分配一个大缓冲区(105 MB 当然很大),那么它将失败并且您的程序将崩溃。如果您需要那么大的缓冲区,则必须在堆上分配它malloc或类似的。我当然会将单个函数的堆栈使用量保持在最多几十 KB,尽管在大多数现有的 Linux 系统上您可能只需要几 MB。

作为替代方案,你可以mmap整个文件进入内存。在大多数情况下,这不会提高或降低性能,但更容易使用。

int r, fdes;
struct stat st;
void *ptr;
size_t sz;

fdes = open(filename, O_RDONLY);
if (fdes < 0) abort();
r = fstat(fdes, &st);
if (r) abort();
if (st.st_size > (size_t) -1) abort(); // too big to map
sz = st.st_size;
ptr = mmap(NULL, sz, PROT_READ, MAP_SHARED, fdes, 0);
if (ptr == MAP_FAILED) abort();
close(fdes); // file no longer needed

// now, ptr has the data, sz has the data length
// you can use ordinary string functions

使用的优点mmap是你的程序不会耗尽内存。在 64 位系统上,您可以同时将整个文件放入您的地址空间(甚至是 10 GB 的文件),系统将在您的程序访问内存时自动读取新的块。旧的块将被自动丢弃,并在您的程序再次需要它们时重新读取。

这是处理大文件的一种非常好的方法。

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

使用c在linux上分块读写 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 获取 ddSlick 下拉列表中所选

    当前返回未定义 注释行中应该包含什么内容来提醒当前的值 1 2 3 或 4
  • Selenium - 如何使用控制台、脚本和网络打开萤火虫

    我已经设置了一个自定义的 firefox 配置文件并在 selenium RC 启动时加载它 该配置文件已安装 firebug 当我使用该配置文件手动启动 firefox 时 firebug 处于活动状态 但是 当 selenium 启动该
  • 将属性名称作为字符串传递到方法中 .NET

    我正在将 LINQ to SQL 用于 NET MVC 应用程序 在我的数据库中 我有一堆包含 Y 或 N 值的列 我正在尝试编写一个通用方法 该方法将返回数据库中的所有记录columnName Y 到目前为止我已经得到了这个 public
  • 如何在 PHP Laravel 5 中配置 Amazon SES SMTP?

    我已将 Amazon SES 集成到 PHP Laravel5 项目中 但我在发送电子邮件时遇到了麻烦 因为我收到此错误 Swift TransportException in AbstractSmtpTransport php line
  • 检查图像是否为灰度的可靠方法

    我目前正在研究一个用例 我需要确定上传的图像是灰度还是 RGB 我找到了几种方法来识别这一点 但不确定它们是否可靠并且可以共同使用来确认图像是否为灰度 第 1 部分 使用 Raster 读取图像并获取 NumberDataElements
  • 目标路径已存在且不是空目录

    我克隆了一个 git 存储库 但不小心弄乱了 所以我重新克隆并显示消息 目标路径已存在且不是空目录 我尝试过删除 Mac 中带有目标路径名称的文件夹 但没有成功 我对编码非常陌生 因此我们将不胜感激 对于根文件夹 以及任何其他文件夹 对于那
  • 为什么 C++ 映射类型参数在使用 [] 时需要空构造函数?

    也可以看看C 标准列表和默认构造类型 https stackoverflow com questions 695372 c standard list and default constructible types 这不是一个主要问题 只是
  • 编写 PHP SQL 更新语句的最佳方法

    我有这个 PHP SQL 语句 updateCategory UPDATE category SET name name description description parent parent active active WHERE i
  • 使用 jquery datepicker 选择所选日期的周数

    我有以下代码用于选择日期 然后将其转换为周数 calendar datepicker showWeek true onSelect function dateText inst dateFormat Week Number datepick
  • TextField 中的 NSAttributedString 在单击时更改/重置

    我正在跟进THIS https developer apple com library mac qa qa1487 index html来自苹果的指南 但它并没有真正正常工作 基本上 我试图通过自定义 WindowController 类向
  • Java 中的 LRU 缓存实现

    我看过下面的代码 我认为addElement方法的实现中有一个无用的while循环 它永远不应该有比 size 1 更多的元素 因为已经有一个写锁 那么为什么 addElement 方法会删除元素直到它达到这个条件 真的 while con
  • 在 Recyclerview 中,如何通过单击和不单击始终突出显示一个适配器项目

    在这里 我单击该项目来更改项目背景和颜色 我已将单击的项目值存储在数据库中 并更改布局颜色和文本颜色 并重新创建适配器并在刷新时再次显示列表 但是当我得到它的位置时 布局颜色没有改变 请始终显示处理背景项颜色集的正确路径 public cl
  • UITableview Commit EditingStyle 具有多个按钮? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在 UITableview 提交编辑样式中添加多个按钮 我需要显示一个带有删除按钮的更多按钮 由于无法使用公共API 所以你可以更好地
  • 有没有办法编写一个匹配除文件夹中的文件之外的所有文件的全局模式?

    我需要编写一个文件 glob 它将匹配除特定文件夹中包含的文件之外的所有文件 例如 除了高级文件夹中包含的文件之外的所有文件 foo 我已经到达以下区域 foo 然而 这个 glob 似乎与 Ruby 中的任何文件都不匹配File fnma
  • jQuery Mobile 和 PhoneGap 中的身份验证

    我有一个使用 jQuery Mobile 和 PHP CodeIgniter 框架 构建的 Web 应用程序 现在我正在尝试制作它的 PhoneGap 版本 以使其可以作为独立应用程序进行分发 但是 PHP Web 应用程序 版本使用 Io
  • 自动用 if/else 替换条件运算符?

    特定的 JS 解析器 不在我的控制范围内 不理解嵌套条件运算符语法 如下所示 return num 1 condition condition something something 因此 我想使用 if else 块替换文件中的所有条件运
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • 连接多个 HLS 主播放列表

    DASH 清单提供了 周期 的概念 用于在单个清单中连接多个剪辑 每个剪辑都有自己的轨道信息 是否有类似的功能允许在一种 master master 播放列表文件中连接多个主播放列表文件 简短的回答 不 不在主播放列表级别 我猜想 HLS
  • 项目组织和命名约定

    这在某种程度上是后续每个模块组件重复模块名称 https stackoverflow com questions 25005897 repeating module name for each module component问题 我们决定
  • 使用c在linux上分块读写

    我有一个 ASCII 文件 其中每一行都包含一个可变长度的记录 例如 Record 1 15 characters Record 2 200 characters Record 3 500 characters Record n X cha