3 回答

TA貢獻1871條經驗 獲得超13個贊
您可以估計剩余基礎上的時間消耗的壓縮而不是數據,生產的未壓縮數據。如果數據相對同質,結果將大致相同。(如果不是,那么無論如何使用輸入或輸出都不會給出準確的估計。)
您可以輕松找到壓縮文件的大小,并使用到目前為止在壓縮數據上花費的時間來估計處理剩余壓縮數據的時間。
下面是一個簡單的例子,使用BZ2Decompress對象一次對輸入一個塊進行操作,顯示讀取進度(Python 3,從命令行獲取文件名):
# Decompress a bzip2 file, showing progress based on consumed input.
import sys
import os
import bz2
import time
def proc(input):
"""Decompress and process a piece of a compressed stream"""
dat = dec.decompress(input)
got = len(dat)
if got != 0: # 0 is common -- waiting for a bzip2 block
# process dat here
pass
return got
# Get the size of the compressed bzip2 file.
path = sys.argv[1]
size = os.path.getsize(path)
# Decompress CHUNK bytes at a time.
CHUNK = 16384
totin = 0
totout = 0
prev = -1
dec = bz2.BZ2Decompressor()
start = time.time()
with open(path, 'rb') as f:
for chunk in iter(lambda: f.read(CHUNK), b''):
# feed chunk to decompressor
got = proc(chunk)
# handle case of concatenated bz2 streams
if dec.eof:
rem = dec.unused_data
dec = bz2.BZ2Decompressor()
got += proc(rem)
# show progress
totin += len(chunk)
totout += got
if got != 0: # only if a bzip2 block emitted
frac = round(1000 * totin / size)
if frac != prev:
left = (size / totin - 1) * (time.time() - start)
print(f'\r{frac / 10:.1f}% (~{left:.1f}s left) ', end='')
prev = frac
# Show the resulting size.
print(end='\r')
print(totout, 'uncompressed bytes')

TA貢獻1806條經驗 獲得超8個贊
在另一個答案的幫助下,我終于找到了解決方案。該想法是使用處理,壓縮文件的總大小的壓縮文件的大小,并將其用于估計的剩余時間的時間。為達到這個,
將壓縮文件作為字節對象讀入內存:
byte_data
,速度相當快計算
byte_data
使用的大小total_size = len(byte_data)
包裝
byte_data
為byte_f = io.BytesIO(byte_data)
包裝
byte_f
為bz2f = bz2.BZ2File(byte_f)
在處理過程中,使用
pos = byte_f.tell()
獲取壓縮文件中的當前位置計算處理的確切百分比
percent = pos/total_size
記錄使用時間,并計算剩余時間
幾秒鐘后,估計會變得非常準確:
0.01% processed, 2.00s elapsed, 17514.27s remaining...
0.02% processed, 4.00s elapsed, 20167.48s remaining...
0.03% processed, 6.00s elapsed, 21239.60s remaining...
0.04% processed, 8.00s elapsed, 21818.91s remaining...
0.05% processed, 10.00s elapsed, 22180.76s remaining...
0.05% processed, 12.00s elapsed, 22427.78s remaining...
0.06% processed, 14.00s elapsed, 22661.80s remaining...
0.07% processed, 16.00s elapsed, 22840.45s remaining...
0.08% processed, 18.00s elapsed, 22937.07s remaining...
....
99.97% processed, 22704.28s elapsed, 6.27s remaining...
99.98% processed, 22706.28s elapsed, 4.40s remaining...
99.99% processed, 22708.28s elapsed, 2.45s remaining...
100.00% processed, 22710.28s elapsed, 0.54s remaining...
添加回答
舉報