MST

星途 面试题库

面试题:Python二进制文件读写的性能优化与复杂场景处理

在处理非常大的二进制文件(例如几个GB)时,常规的逐块读取方式可能会导致内存不足或性能瓶颈。请设计一个Python解决方案,高效地读取这种大文件,对文件中的数据进行特定的加密处理(如AES加密,假设已导入相关加密库),并将加密后的数据写入到另一个文件中,同时要保证整个过程对内存的占用尽可能少。请详细描述设计思路并给出关键代码片段。
39.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 分块读取:使用固定大小的块来读取大文件,避免一次性将整个文件读入内存。这样可以有效控制内存使用量。
  2. 逐块加密:对每一块读取的数据进行AES加密处理。
  3. 逐块写入:将加密后的数据逐块写入到另一个文件中。

关键代码片段

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os


def encrypt_large_file(input_file_path, output_file_path, key):
    # 创建AES加密器
    cipher = AES.new(key, AES.MODE_CBC)

    with open(input_file_path, 'rb') as infile, open(output_file_path, 'wb') as outfile:
        # 写入初始化向量(IV)
        outfile.write(cipher.iv)

        while True:
            # 分块读取文件
            chunk = infile.read(1024 * 1024)  # 每次读取1MB
            if not chunk:
                break
            # 对数据块进行填充并加密
            padded_chunk = pad(chunk, AES.block_size)
            encrypted_chunk = cipher.encrypt(padded_chunk)
            # 将加密后的数据块写入输出文件
            outfile.write(encrypted_chunk)


# 示例使用
key = b'16 byte key1234567'  # 16, 24 或 32字节长的密钥
input_file = 'large_file.bin'
output_file = 'encrypted_large_file.bin'
encrypt_large_file(input_file, output_file, key)

上述代码使用pycryptodome库进行AES加密,以1MB的块大小读取输入文件,加密后写入输出文件。注意需要先安装pycryptodome库 (pip install pycryptodome)。