如何在Python中解析大于100GB的文件?

2024-01-06

我有大约 100 GB 大小的文本文件,格式如下(具有线路、ip 和域的重复记录):

domain|ip 
yahoo.com|89.45.3.5
bbc.com|45.67.33.2
yahoo.com|89.45.3.5
myname.com|45.67.33.2
etc.

我尝试使用以下 python 代码解析它们,但仍然出现内存错误。有人知道解析此类文件的更优化方法吗? (时间对我来说是一个重要因素)

files = glob(path)
for filename in files:
    print(filename)
    with open(filename) as f:
        for line in f:
            try:
                domain = line.split('|')[0]
                ip = line.split('|')[1].strip('\n')
                if ip in d:
                    d[ip].add(domain)
                else:
                    d[ip] = set([domain])
            except:
                print (line)
                pass

    print("this file is finished")

for ip, domains in d.iteritems():
    for domain in domains:
        print("%s|%s" % (ip, domain), file=output)

Python 对象比磁盘上相同的值占用更多的内存;引用计数有一点开销,并且在集合中还需要考虑每个值的缓存哈希值。

不要将所有这些对象读入(Python)内存;使用数据库代替。 Python 附带了一个用于 SQLite 数据库的库,使用它可以将文件转换为数据库。然后您可以从中构建输出文件:

import csv
import sqlite3
from itertools import islice

conn = sqlite3.connect('/tmp/ipaddresses.db')
conn.execute('CREATE TABLE IF NOT EXISTS ipaddress (domain, ip)')
conn.execute('''\
    CREATE UNIQUE INDEX IF NOT EXISTS domain_ip_idx 
    ON ipaddress(domain, ip)''')

for filename in files:
    print(filename)
    with open(filename, 'rb') as f:
        reader = csv.reader(f, delimiter='|')
        cursor = conn.cursor()
        while True:
            with conn:
                batch = list(islice(reader, 10000))
                if not batch:
                    break
                cursor.executemany(
                    'INSERT OR IGNORE INTO ipaddress VALUES(?, ?)',
                    batch)

conn.execute('CREATE INDEX IF NOT EXISTS ip_idx ON ipaddress(ip)')
with open(outputfile, 'wb') as outfh:
    writer = csv.writer(outfh, delimiter='|')
    cursor = conn.cursor()
    cursor.execute('SELECT ip, domain from ipaddress order by ip')
    writer.writerows(cursor)

这会按 10000 个批次处理您的输入数据,并生成一个索引进行排序after插入。生成索引需要一些时间,但它完全适合您的可用内存。

The UNIQUE在开始时创建的索引可确保仅插入唯一的域 - IP 地址对(因此仅跟踪每个 IP 地址的唯一域);这INSERT OR IGNORE语句会跳过数据库中已存在的任何对。

仅包含您提供的示例输入的简短演示:

>>> import sqlite3
>>> import csv
>>> import sys
>>> from itertools import islice
>>> conn = sqlite3.connect('/tmp/ipaddresses.db')
>>> conn.execute('CREATE TABLE IF NOT EXISTS ipaddress (domain, ip)')
<sqlite3.Cursor object at 0x106c62730>
>>> conn.execute('''\
...     CREATE UNIQUE INDEX IF NOT EXISTS domain_ip_idx 
...     ON ipaddress(domain, ip)''')
<sqlite3.Cursor object at 0x106c62960>
>>> reader = csv.reader('''\
... yahoo.com|89.45.3.5
... bbc.com|45.67.33.2
... yahoo.com|89.45.3.5
... myname.com|45.67.33.2
... '''.splitlines(), delimiter='|')
>>> cursor = conn.cursor()
>>> while True:
...     with conn:
...         batch = list(islice(reader, 10000))
...         if not batch:
...             break
...         cursor.executemany(
...             'INSERT OR IGNORE INTO ipaddress VALUES(?, ?)',
...             batch)
... 
<sqlite3.Cursor object at 0x106c62810>
>>> conn.execute('CREATE INDEX IF NOT EXISTS ip_idx ON ipaddress(ip)')
<sqlite3.Cursor object at 0x106c62960>
>>> writer = csv.writer(sys.stdout, delimiter='|')
>>> cursor = conn.cursor()
>>> cursor.execute('SELECT ip, domain from ipaddress order by ip')
<sqlite3.Cursor object at 0x106c627a0>
>>> writer.writerows(cursor)
45.67.33.2|bbc.com
45.67.33.2|myname.com
89.45.3.5|yahoo.com
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中解析大于100GB的文件? 的相关文章

  • 没有任何元数据的 zip 文件

    我想找到一种简单的方法来压缩一堆文件 而无需任何文件元数据 例如时间戳 这zip命令似乎总是保留元数据 我没有找到禁用元数据的方法 我希望解决方案是一个命令或最多一个 python 脚本 谢谢 正如一些帖子已经指出的那样 zip 标头中的大
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • 从字符串到类型的词法转换

    最近 我尝试用Python存储和读取文件中的信息 遇到了一个小问题 我想从文本文件中读取类型信息 从 string 到 int 或 float 的类型转换非常有效 但从 string 到 type 的类型转换似乎是另一个问题 当然 我尝试了
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • Python 3 __getattribute__ 与点访问行为

    我读了一些关于 python 的对象属性查找的内容 这里 https blog ionelmc ro 2015 02 09 understanding python metaclasses object attribute lookup h
  • 如何从 PyCharm 项目中获取我的“exe”[重复]

    这个问题在这里已经有答案了 通过 PyCharm 在 Python 上编写一些项目 我想从中获取一个exe文件 我尝试过 另存为 gt XXX exe 但是 当我尝试执行它时出现错误 此类操作系统不支持该文件 附注 我有win7 x64 它
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 如果字段值在外部列表中,Django 会注释布尔值

    想象一下我有这个 Django 模型 class Letter models Model name models CharField max length 1 unique True 还有这个列表 vowels a e i o u 我想查询
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 如何使用 python urllib 在 HTTP/1.1 中保持活力

    现在我正在这样做 Python3 urllib url someurl headers HOST somehost Connection keep alive Accept Encoding gzip deflate opener urll
  • 在径向(树)网络x图中查找末端节点(叶节点)

    给定下图 是否有一种方便的方法来仅获取末端节点 我所说的端节点是指那些具有一个连接边的到节点 我认为这些有时被称为叶节点 G nx DiGraph fromnodes 0 1 1 1 1 1 2 3 4 5 5 5 7 8 9 10 ton
  • 获取列表中倒数第二个元素[重复]

    这个问题在这里已经有答案了 我可以通过以下方式获取列表的倒数第二个元素 gt gt gt lst a b c d e f gt gt gt print lst len lst 2 e 有没有比使用更好的方法print lst len lst
  • Python 中的 @staticmethod 与 @classmethod

    方法和方法有什么区别装饰的 https peps python org pep 0318 with staticmethod http docs python org library functions html staticmethod和
  • 在可编辑的QSqlQueryModel中实现setEditStrategy

    这是后续这个问题 https stackoverflow com questions 49752388 editable qtableview of complex sql query 在那里 我们创建了 QSqlQueryModel 的可
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • Python 3.2 中 **kwargs 和 dict 有什么区别?

    看起来Python的很多方面都只是功能的重复 除了我在 Python 中的 kwargs 和 dict 中看到的冗余之外 还有什么区别吗 参数解包存在差异 许多人使用kwargs 并通过dict作为论据之一 使用参数解包 Prepare f
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代
  • 如何将列表字典写入字符串而不是 CSV 文件?

    This 堆栈溢出问题 https stackoverflow com questions 37997085 how to write a dictionary of lists to a csv file将列表字典写入 CSV 文件的答案

随机推荐

  • 如何为QPlainTextEdit设置文本?

    Qt5的文档没有提到这一点QPlainTextEdit has setText QString like QTextEdit做 但是 我不认为这是不可能的 我发现的唯一方法是使用QTextDocument其中可以有setPlainText
  • 如何将二维数组从Python传递到C?

    我正在尝试使用 ctypes 将二维数组从 Python 传递到 C 数组数据类型为 uint16 我写了一个简单的代码只是为了理解它是如何工作的 C include
  • 手风琴在移动设备中默认折叠,在桌面设备中默认展开 Bootstrap 3 响应式

    我正在使用 bootstrap 3 创建一些手风琴 我的要求是所有手风琴都应默认以 1024 及以上分辨率展开 单击它应该隐藏 但在移动设备中 默认情况下它应该处于折叠模式 单击它应该展开 这是我的代码 div class panel gr
  • 使用 XmlSlurper:如何在迭代 GPathResult 时选择子元素

    我正在编写一个 HTML 解析器 它使用 TagSoup 将格式良好的结构传递给 XMLSlurper 这是通用代码 def htmlText div class divclass h2 Heading 2 h2 ol li h3 a cl
  • Bash 将 awk 的输出捕获到数组中

    我被一个小问题困住了 我有一个命令将输出传输到 awk 但我想将输出一一捕获到数组 我的例子 myarr ps u kdride awk print 1 但这将我的所有输出捕获到一个用逗号分隔的巨大字符串中 output PID 3856
  • 基于 ASP.net 的开源支持票系统 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找基于 ASP net 的开源支持票系统 有什么建议吗 https github com Nu
  • 脚本管理器 4.5 处理错误

    我有一个脚本管理器 ASP NET 4 5 MSForms js 等 我正在研究处理错误的方法 我已经映射了以下内容 以前的版本可以正常工作 Sys WebForms PageRequestManager getInstance add e
  • 从图像中提取数字

    I have an image for mobile phone credit recharge card and I want to extract the recharge number only the gray area as a
  • Oracle APEX - 根据包含的值有条件地更改交互式报表上单元格中的文本颜色?

    好吧 那么 我在 APEX 中有一个交互式报告 显示有关我们系统中文档的数据 我们的文件应该每两年审查一次 表中有一列包含文件下次审查的日期 我们希望在包含日期的单元格或行中的另一个单元格中直观地指示日期何时达到特定基准 即 当日期在当前日
  • 混合详细视图和表单 Mixin django 的问题

    我正在尝试使用 Django 为我的应用程序的博客部分创建一个评论系统 我试图将我的详细视图与表单 mixin 混合在一起 但我有点挣扎 提交表单后 不会保存 也不会出现错误 如果你们中的任何人可以提供帮助 我将不胜感激 这是我的观点 cl
  • 专注于 editText 会导致崩溃

    我正在经历一种非常不寻常的行为 从今天开始 没有完成样式 Gradle 或布局更改 每次我点击EditText or TextInputEditText 只需将焦点放在它们上 应用程序崩溃并出现以下错误 java lang ClassCas
  • 创建加盐哈希密码的正确方法

    我是在数据库上存储密码的新手 根据我读到的内容 我在下面创建了一个简单的 php 脚本 我这样做正确吗 盐应该作为字节数据类型存储在数据库中吗 最终的哈希值应该存储在数据库中的字符串数据类型中吗 如果你正在跑步 PHP 5 gt 5 5 0
  • 如何从 Recycler 视图中拖放图像并将其放置在另一个布局中

    我有一个水平 Recycler 视图 其中包含项目列表 每个项目都有一个文本视图和图像视图来表示该项目 例如 正方形的图像和图像上方的文本 Square 回收器视图位于其自己的内部 相对布局位于屏幕顶部 我需要做的是将图像从回收器视图中拖放
  • 延迟加载中的多个容器

    我正在尝试申请延迟加载插件 http www appelsiini net projects lazyload到多个容器 我发现了这个类似的问题 多个水平容器上的延迟加载 https stackoverflow com questions
  • Nodejs 中的 Promisify 事件处理程序和超时

    我有一个回调处理程序来处理 websocket 事件 我正在尝试编写一个返回承诺的函数 如果调用处理程序 则应解决承诺 如果处理程序未执行 则应拒绝承诺 有一个更好的方法吗 var callbackCalled false var mess
  • Nativescript 图像转为 Base64,然后获取 POST

    如何对图像进行 Base64 处理 以便适合使用 NativeScript 获取模块发送 这是使用测试服务器的情况的基本演示 use strict var imageSourceModule require image source fun
  • python 与 Quickbooks Online API v3

    我需要一些帮助来实现一个访问 Quickbooks API 的 python 应用程序 我已经成功编写了几个使用 API 的应用程序 但是一旦我们进入 OAuth 世界 我就有点迷失了 无论如何 我在这里找到了 fastbooks pyth
  • Azure 函数的多个触发器

    我们有一个带有事件中心触发器的 Azure 函数 是否可以在同一 Azure Function 的多个事件中心上设置触发器 不 目前不支持这种情况 来自评论 Ling Toh Jan 18 17 at 18 23 没有计划支持每个函数多个触
  • 没有找到 ID 的视图...对于片段 PlaceholderFragment

    我有一个简单的应用程序 基于Android First App 示例 http developer android com training basics firstapp starting activity html 它所做的唯一一件事就
  • 如何在Python中解析大于100GB的文件?

    我有大约 100 GB 大小的文本文件 格式如下 具有线路 ip 和域的重复记录 domain ip yahoo com 89 45 3 5 bbc com 45 67 33 2 yahoo com 89 45 3 5 myname com