有没有一种方法可以加快读取和处理大型(非结构化)二进制文件的速度?

时间:2019-06-10 17:20:45

标签: python

我正在编写一个加密文件的程序,但是速度太快了,每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)

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

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

1 个答案:

答案 0 :(得分:0)

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

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