3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
您可以估計(jì)剩余基礎(chǔ)上的時(shí)間消耗的壓縮而不是數(shù)據(jù),生產(chǎn)的未壓縮數(shù)據(jù)。如果數(shù)據(jù)相對(duì)同質(zhì),結(jié)果將大致相同。(如果不是,那么無論如何使用輸入或輸出都不會(huì)給出準(zhǔn)確的估計(jì)。)
您可以輕松找到壓縮文件的大小,并使用到目前為止在壓縮數(shù)據(jù)上花費(fèi)的時(shí)間來估計(jì)處理剩余壓縮數(shù)據(jù)的時(shí)間。
下面是一個(gè)簡單的例子,使用BZ2Decompress對(duì)象一次對(duì)輸入一個(gè)塊進(jìn)行操作,顯示讀取進(jìn)度(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貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
在另一個(gè)答案的幫助下,我終于找到了解決方案。該想法是使用處理,壓縮文件的總大小的壓縮文件的大小,并將其用于估計(jì)的剩余時(shí)間的時(shí)間。為達(dá)到這個(gè),
將壓縮文件作為字節(jié)對(duì)象讀入內(nèi)存:
byte_data
,速度相當(dāng)快計(jì)算
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()
獲取壓縮文件中的當(dāng)前位置計(jì)算處理的確切百分比
percent = pos/total_size
記錄使用時(shí)間,并計(jì)算剩余時(shí)間
幾秒鐘后,估計(jì)會(huì)變得非常準(zhǔn)確:
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...
添加回答
舉報(bào)