【发布时间】: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