【问题标题】:Is there a way to speed up reading and handling large (unstructured) binary files?有没有办法加快读取和处理大型(非结构化)二进制文件的速度?
【发布时间】:2019-06-10 17:20:45
【问题描述】:

我正在编写一个加密文件的程序,但是速度非常可怕,每 1MiB 块运行大约 1.5 秒。有什么办法可以加快速度吗?

我使用的是 Python 3.x,当前的加密方法在加密之前将传递的数据转换为 base64。每个文件(目前)被拆分为 1MiB 块并写入这些块中的目标目录。 self.ep 指的是未加密的目录,self.sp_bp 指的是每个加密保存到的文件夹。 mdata 是包含元数据的字典。 我尝试增加块大小,但效果不大,并添加了 write=True 位以防止将块写入相同的块以尝试解决问题。

for fn in files:
    print("File: {}".format(fn))
    fp = os.path.join(root,fn)
    rfp = self.getRelativePath(fp,self.ep)
    rfp = self.e.encryptString(rfp.encode("utf-8"),key)
    mdata["files"][rfp] = []
    with open(fp,"rb") as f:
        buf = f.read(self.BLOCKSIZE)
        while len(buf) > 0:
            blockno += 1
            mdata["totalblocks"] += 1
            print("  Block: {}".format(blockno))
            mdata["files"][rfp].append(blockno)

            buf = self.e.encryptString(buf,key).encode("utf-8")

            hasher = hashlib.sha512()
            hasher.update(buf)
            hash = hasher.hexdigest()
            mdata["blockhashes"][blockno] = hash

            write = True
            if os.path.exists(os.path.join(self.sp_bp,"block{}".format(blockno))):
                with open(os.path.join(self.sp_bp,"block{}".format(blockno)),"rb") as bf:
                    otherblk = bf.read()
                if buf == otherblk:
                    write = False

            if write:
                with open(os.path.join(self.sp_bp,"block{}".format(blockno)),"wb") as bf:
                    bf.write(buf)
            buf = f.read(self.BLOCKSIZE)

如前所述,加密运行时间约为每兆字节 1.5 秒(1024^2 字节),但在处理大文件时太慢了。

编辑:分享了一些有用的信息。 self.BLOCKSIZE 等于 1024*1024 或 1048576。这等于 1 MiB 中的字节数。 'os.path.join(self.sp_bp,"block{}".format(blockno))' 部分是一个 sn-p,旨在将块编号转换为有效文件名以存储在 'vault' 中。 blockno 等于当前块号,self.sp_bp 是存储加密块的文件夹(“保险库”)的路径。 没有使用临时文件,只有原始输入文件(未加密)和加密的“块”。

【问题讨论】:

  • 你没有分享 self.BLOCKSIZE 的值。增加这可能会有很大帮助。解释文件的使用,特别是 "block{}" 的东西,可能有助于我们理解你在做什么。如果您读写临时文件,则不要。很慢。
  • 我建议找一种方法或算法,在加密前不将数据转成base64,通常转成base64文件会变大

标签: python


【解决方案1】:

我已经找到了问题的原因。加密例程为转换后的 base64 中的每个字符运行一个 for 循环。 for 循环需要很长时间才能运行,因此为每个字符运行循环非常耗时。

我正在研究一种通过对字符进行分组以大大减少迭代次数来加速加密的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2018-03-23
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多