如何使用python-gnupg加密大型数据集而不占用所有内存?

时间:2016-02-15 23:34:55

标签: python encryption gnupg

我在磁盘上有一个非常大的文本文件。假设它是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连接到一个文件中。

2 个答案:

答案 0 :(得分:0)

行加密行会导致大量的OpenPGP文档,这不仅会使解密变得更加复杂,而且还会大大增加文件大小和计算工作量。

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

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

这会产生具有恒定和低内存要求的流式传输行为。

答案 1 :(得分:0)

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