繁体   English   中英

如何在不占用所有内存的情况下使用 python-gnupg 加密大型数据集?

[英]How to encrypt a large dataset using python-gnupg without sucking up all the memory?

我在磁盘上有一个非常大的文本文件。 假设它是 1 GB 或更多。 还假设此文件中的数据每 120 个字符有一个\\n字符。

我正在使用python-gnupg来加密这个文件。 由于文件太大,我无法一次将整个文件读入内存。

但是,我使用的gnupg.encrypt()方法要求我一次发送所有数据——而不是分块发送。 那么如何在不耗尽所有系统内存的情况下加密文件?

下面是一些示例代码:

import gnupg
gpg = gnupg.GPG(gnupghome='/Users/syed.saqibali/.gnupg/')

for curr_line in open("VeryLargeFile.txt", "r").xreadlines():
    encrypted_ascii_data = gpg.encrypt(curr_line, "recipient@gmail.com")
    open("EncryptedOutputFile.dat", "a").write(encrypted_ascii_data)

此示例生成无效的输出文件,因为我不能简单地将加密的 blob 连接到一个文件中。

逐行加密会产生大量的OpenPGP文件,不仅会使解密变得更加复杂,而且会极大地破坏文件大小和计算量。

Python 的 GnuPG 模块还知道一个方法encrypt_file ,该方法将流作为输入并知道可选的output参数以将结果直接写入文件。

with open("VeryLargeFile.txt", "r") as infile:
    gpg.encrypt_file(
            infile, "recipient@example.org",
            output="EncryptedOutputFile.dat")

这导致具有恒定和低内存要求的流行为。

我在 open 命令中添加了一个“b”(二进制),它对我的​​代码很有用。 不过,由于某种原因,以这种方式加密比通过 shell/bash 命令加密的速度慢一半。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM