AES 内存效率
AES memory efficiency
我正在为使用 CTR 块链的 AES 加密编写一个 C++ 程序,但我的问题不需要这两个方面的知识。
我想知道我应该缓冲多少文件来加密并输出到新的加密文件。我问这个是因为我知道磁盘读取非常昂贵,所以如果可能的话,我应该读取和缓冲整个原始文件,加密,输出到新文件才有意义。但是,如果文件是 1gb,我不想在加密期间在主内存中保留整个 1gb。
那么,我很好奇最佳缓冲区大小是多少?例如,缓冲 100mb 并执行 10 次加密迭代以处理整个 1gb 文件。谢谢。
Memory map 文件并让系统计算出正确的缓冲区大小。
通常文件都会缓冲到主内存中(在服务器和桌面系统上)。因此,您的应用程序中的缓冲区大小可以保持相对较小。 1 MiB 就足够了,在任何具有 1 GiB 或更多主内存的系统上可能无关紧要。
在不缓冲内存的嵌入式系统上,可能需要弄清楚底层发生了什么以及需要占用多少内存。我认为大约 1-8 KiB 的缓冲区是一个很好的最低要求。如果低于该值,您可能还想对 AES 操作进行计时。
为了确保以后可以进行优化,您可能希望保持缓冲区为 64 字节的倍数(AES 的块大小为 16 字节,SHA-2 512 的块大小为 64 字节)。一般来说,尽量保持 2 的全幂或尽可能接近(1 MiB 是 2^20 字节)。
谁告诉你的 "disk reads are quite expensive"?除非您正在处理数 TB 的数据,否则 IO 的成本将变得无关紧要,您将很难对其进行测量。 1MB 的缓冲区将远远超过您的需要。我敢打赌,您很难找到 64KB 和 1MB 或更大内存之间的基准差异。
一个例外情况是,如果您从非常慢的设备读取大量数据,例如网络拥挤的 NAS 驱动器,但即便如此我认为任何实现缓冲的努力都是错误的优化。在那种情况下,将数据复制到本地驱动器,从本地存储中处理它。
无论如何,C++ 都会使用合理的默认值缓冲输入和输出,而且大多数操作系统会在您顺序读取时获取数据块,以便提高检索效率。除非你有非常令人信服的理由,否则请坚持正常行为。应该不需要编写自定义缓冲代码。
我正在为使用 CTR 块链的 AES 加密编写一个 C++ 程序,但我的问题不需要这两个方面的知识。
我想知道我应该缓冲多少文件来加密并输出到新的加密文件。我问这个是因为我知道磁盘读取非常昂贵,所以如果可能的话,我应该读取和缓冲整个原始文件,加密,输出到新文件才有意义。但是,如果文件是 1gb,我不想在加密期间在主内存中保留整个 1gb。
那么,我很好奇最佳缓冲区大小是多少?例如,缓冲 100mb 并执行 10 次加密迭代以处理整个 1gb 文件。谢谢。
Memory map 文件并让系统计算出正确的缓冲区大小。
通常文件都会缓冲到主内存中(在服务器和桌面系统上)。因此,您的应用程序中的缓冲区大小可以保持相对较小。 1 MiB 就足够了,在任何具有 1 GiB 或更多主内存的系统上可能无关紧要。
在不缓冲内存的嵌入式系统上,可能需要弄清楚底层发生了什么以及需要占用多少内存。我认为大约 1-8 KiB 的缓冲区是一个很好的最低要求。如果低于该值,您可能还想对 AES 操作进行计时。
为了确保以后可以进行优化,您可能希望保持缓冲区为 64 字节的倍数(AES 的块大小为 16 字节,SHA-2 512 的块大小为 64 字节)。一般来说,尽量保持 2 的全幂或尽可能接近(1 MiB 是 2^20 字节)。
谁告诉你的 "disk reads are quite expensive"?除非您正在处理数 TB 的数据,否则 IO 的成本将变得无关紧要,您将很难对其进行测量。 1MB 的缓冲区将远远超过您的需要。我敢打赌,您很难找到 64KB 和 1MB 或更大内存之间的基准差异。
一个例外情况是,如果您从非常慢的设备读取大量数据,例如网络拥挤的 NAS 驱动器,但即便如此我认为任何实现缓冲的努力都是错误的优化。在那种情况下,将数据复制到本地驱动器,从本地存储中处理它。
无论如何,C++ 都会使用合理的默认值缓冲输入和输出,而且大多数操作系统会在您顺序读取时获取数据块,以便提高检索效率。除非你有非常令人信服的理由,否则请坚持正常行为。应该不需要编写自定义缓冲代码。