逐行处理非常大(>20GB)的文本文件

2023-12-22

我有许多需要处理的非常大的文本文件,最大的约为 60GB。

每行有 7 个字段中的 54 个字符,我想从前三个字段中删除最后三个字符 - 这应该将文件大小减少约 20%。

我是 Python 新手,并且有一个代码可以以每小时 3.4 GB 左右的速度完成我想做的事情,但要成为一项有价值的练习,我确实需要至少达到 10 GB/小时 - 有什么办法可以加快速度这了?这段代码并没有接近挑战我的处理器,所以我做出了一个未经教育的猜测,它受到内部硬盘驱动器读写速度的限制?

def ProcessLargeTextFile():
    r = open("filepath", "r")
    w = open("filepath", "w")
    l = r.readline()
    while l:
        x = l.split(' ')[0]
        y = l.split(' ')[1]
        z = l.split(' ')[2]
        w.write(l.replace(x,x[:-3]).replace(y,y[:-3]).replace(z,z[:-3]))
        l = r.readline()
    r.close()
    w.close()

任何帮助将非常感激。我在 Windows 7 上使用 IDLE Python GUI,并拥有 16GB 内存 - 也许不同的操作系统会更高效?

Edit:这是要处理的文件的摘录。

70700.642014 31207.277115 -0.054123 -1585 255 255 255
70512.301468 31227.990799 -0.255600 -1655 155 158 158
70515.727097 31223.828659 -0.066727 -1734 191 187 180
70566.756699 31217.065598 -0.205673 -1727 254 255 255
70566.695938 31218.030807 -0.047928 -1689 249 251 249
70536.117874 31227.837662 -0.033096 -1548 251 252 252
70536.773270 31212.970322 -0.115891 -1434 155 158 163
70533.530777 31215.270828 -0.154770 -1550 148 152 156
70533.555923 31215.341599 -0.138809 -1480 150 154 158

像这样编写代码更惯用

def ProcessLargeTextFile():
    with open("filepath", "r") as r, open("outfilepath", "w") as w:
        for line in r:
            x, y, z = line.split(' ')[:3]
            w.write(line.replace(x,x[:-3]).replace(y,y[:-3]).replace(z,z[:-3]))

这里主要的节省就是做split一次,但如果 CPU 没有被征税,这可能不会产生什么影响

It may有助于一次保存几千行并一次写入它们,以减少硬盘驱动器的抖动。一百万行是only54MB 内存!

def ProcessLargeTextFile():
    bunchsize = 1000000     # Experiment with different sizes
    bunch = []
    with open("filepath", "r") as r, open("outfilepath", "w") as w:
        for line in r:
            x, y, z = line.split(' ')[:3]
            bunch.append(line.replace(x,x[:-3]).replace(y,y[:-3]).replace(z,z[:-3]))
            if len(bunch) == bunchsize:
                w.writelines(bunch)
                bunch = []
        w.writelines(bunch)

由@Janne建议,另一种生成线条的方法

def ProcessLargeTextFile():
    bunchsize = 1000000     # Experiment with different sizes
    bunch = []
    with open("filepath", "r") as r, open("outfilepath", "w") as w:
        for line in r:
            x, y, z, rest = line.split(' ', 3)
            bunch.append(' '.join((x[:-3], y[:-3], z[:-3], rest)))
            if len(bunch) == bunchsize:
                w.writelines(bunch)
                bunch = []
        w.writelines(bunch)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逐行处理非常大(>20GB)的文本文件 的相关文章

随机推荐

  • diff 2个大型数据库表

    给定 2 个大表 想象一下数亿行 每个表都有一个字符串列 如何获得差异 查看开源 Percona 工具包 具体来说 pt 表同步 http www percona com doc percona toolkit pt table sync
  • 我了解 Perl 5。学习 Perl 6 比转向 Python 有什么优势? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Facebook iOS SDK - 移动应用程序安装跟踪不起作用

    我在我的应用程序中使用 Facebook SDK 版本 4 5 1 APP ID URL 方案 应用程序显示名称等已正确合并到 info plist 中 我们的应用程序内有身份验证和共享功能 所有这些功能都按预期完美运行 对于事件跟踪 我们
  • jQuery UI Datepicker 和 Google Chrome 不工作

    我在使用 jQueryUI Datepicker 和 Google Chrome 时遇到一些问题 我的日期选择器在 IE8 Firefox 和 Safari 上按预期工作 问题是在 Chrome 中单击日期选择器连接的文本框时 它给了我一个
  • 如何将两个windows vc静态库合并为一个

    我有两个静态库a lib and b lib C语言的 它是使用VC6 Visual studio 6 0 生成的 我想将这两个库合并为一个静态库c lib 如何在 CLI 模式下执行此操作 我见过合并 nix 静态库 https stac
  • Firebase Storage 和 Dropzone.js 按下按钮时上传多个图像

    本质上我想做的是允许人们添加文件 然后按下按钮将图像上传到 Firebase 存储 我决定使用 Dropzone js 因为该包编写良好且可自定义 但我仍然感到困惑 我有这段代码 允许我将多个图像上传到 Firebase 但是 我希望它适合
  • 如果两个指针都转换为整数类型,则比较两个指针是否具有 < 未定义行为?

    假设我有这段代码 可以根据内存块的位置按特定顺序将一个内存块复制到另一个内存块 void my memmove void dest const void src size t len const unsigned char s const
  • java.lang.NoClassDefFoundError:无法初始化类 javax.imageio.ImageIO jboss EAP 6

    我们正在使用 JBoss EAP 6 直到生产环境一切正常 但是在生产环境中部署后 我们收到以下错误 java lang NoClassDefFoundError Could not initialize class javax image
  • OkHTTPClient将cookie传递给Webview

    我通过 OKHttpClient 帖子以用户身份登录 我想与 webview 共享 cookie 使用 OkHttp 3 0 您可以使用类似于与 HttpURLConnection 共享的方法 通过创建使用 webkit cookie 存储
  • 如何在 Xamarin 中使用 Activity 属性 android:showForAllUsers?

    该属性未在 Xamarin 中实现 这意味着我无法将其声明为我的 Activity 类的属性 如下所示 Activity Label string app name Theme style MainTheme StopAlarm Launc
  • 如何启用和禁用组件?

    如何从 java 代码的清单中启用然后禁用组件 采用 Pawan 方法进行更通用的实施 public static void setComponentState Context context String packageName Stri
  • 缩放 Phonegap 应用程序以适应不同的 Android 屏幕尺寸/密度?

    我有一个 Phonegap 应用程序 旨在在 Android 手机和平板电脑上运行 文本和图像的比例在手机上看起来不错 但在 7 英寸平板电脑上看起来太小 有没有办法为基于 Phonegap 的应用程序设置不同屏幕尺寸 密度的比例 对于本机
  • Rails 3 - 嵌套资源和多态路径:可以达到两级,但在三级时中断

    我正在尝试做一个简单的家庭聚会网站 其中包含 帖子 家庭 孩子 和 图片 理想情况下 我希望路由 关系的结构如下 resources posts do resources pictures end resources fams do res
  • 如何分享 Android 项目?

    我正在尝试从 Android 项目发送文件 以便我的一个朋友可以在 Eclipse 中打开一个新的 Android 项目 并从他们的家用计算机上处 理代码 运行该项目 但是 我遇到了一些处理丢失清单文件和不匹配签名的问题 捆绑 Androi
  • 如何将 Groovy 中的文件读入字符串?

    我需要从文件系统读取文件并将整个内容加载到 groovy 控制器中的字符串中 最简单的方法是什么 String fileContents new File path to file text 如果需要指定字符编码 请使用以下命令 Strin
  • 为什么我的 MVC ViewModel 成员被我的 ActionResult 参数覆盖?

    这是一个错误还是一个功能 为了简洁和易于复制 下面的所有代码都经过简化 除了突出显示行为之外 实际上没有做任何有用的事情 我有一个包含名为 ID 的 int 的类 public class FooterLink public int ID
  • 使用 Airtable 获取超过 100 条记录

    我正在构建一个应用程序 它使用 Requests 库获取 Airtable 上的数据库并将其转换为列表 我的问题是我只能通过 URL 请求获取 100 条记录 我尝试在 Airtable API 中找到解决方案 但是更改插入 maxReco
  • 更改方法中传递的变量[重复]

    这个问题在这里已经有答案了 如何使用方法更改变量的内容 也许我说得不正确 有什么方法可以像 C 中那样获取对变量的引用 例子 main stuff int gorilla 29 makeMeABanana gorilla void make
  • 如何保存 Atom 编辑器配置和已安装的软件包列表

    我最近开始使用 Atom 编辑器 到目前为止它非常棒 我计划将其安装在其他几台机器上 如何将当前计算机上安装的配置和软件包列表复制到其他计算机 是否有一个配置可以用来在其他机器上导出和导入它们 Use Git https git scm c
  • 逐行处理非常大(>20GB)的文本文件

    我有许多需要处理的非常大的文本文件 最大的约为 60GB 每行有 7 个字段中的 54 个字符 我想从前三个字段中删除最后三个字符 这应该将文件大小减少约 20 我是 Python 新手 并且有一个代码可以以每小时 3 4 GB 左右的速度