java - Bagaimana untuk menyahmampat data dalam beberapa blok data individu fail gzip semasa menstrimkannya?
PHP中文网
PHP中文网 2017-06-12 09:25:31
0
2
1248

Penerangan adegan:

现有许多行日志文本,按天压缩成一个个TB级的gzip文件。
使用流对每个压缩文件的数据段进行传输然后解压,对解压出的文本分词并索引
以后查到这个词时,定位到这个词所在的文件和段,再用流传输并解压
(实际上是想利用已有的压缩文件构造一个类似ES的搜索引擎)

Masalahnya sekarang ialah kerana apa yang diterima bukanlah fail termampat yang lengkap tetapi menyekat data binari, data yang diterima tidak boleh dimampatkan kerana maklumat yang tidak lengkap

Sekarang saya ingin melaksanakan fungsi sedemikian: pertama nyahmampat data aliran yang diterima dan memulihkannya untuk melengkapkan data (data log asal dipisahkan oleh baris baharu, adalah baik untuk mendapatkan teks sebelum pemampatan setiap data aliran dan mengimbangi fail yang sepadan), dan kemudian mempertimbangkan bahawa proses seperti penghantaran dan penyimpanan boleh menyebabkan ralat data, jadi untuk setiap aliran data, nyahmampat data sebanyak mungkin sekiranya berlaku ralat.

Sebahagian daripada kod yang berkaitan adalah seperti berikut: (diubah suai daripada https://stackoverflow.com/que...)

import zlib
import traceback

CHUNKSIZE=30

d = zlib.decompressobj(16 + zlib.MAX_WBITS)

f = open('test.py.gz','rb')
buffer = f.read(CHUNKSIZE)

i = 0
while buffer :
    i += 1
    try:
        #skip two chunk 
        if i < 3 or i > 4:
            outstr = d.decompress(buffer)
            print('*'*10 + outstr + '#'*10)
    except Exception, e:
        print(traceback.print_exc())
    finally:
        buffer = f.read(CHUNKSIZE)


outstr = d.flush()
print(outstr)

f.close()

Apabila i>=3, ralat dilaporkan setiap kali dalam gelung
Kesimpulan saya ialah jika strim tidak berterusan (melangkau untuk menerima sebahagian daripada data), maka data berikutnya tidak boleh dinyahmampat.
Soalan 1: Bagaimanakah kita boleh menyahmampat dengan betul setiap bahagian data yang diterima? (Oleh kerana ia mungkin melibatkan algoritma dan struktur data pemampatan gzip, saya sedang melihat kod yang berkaitan. Jika masalah itu boleh diselesaikan dengan menambahkan chuck tertentu dalam pengepala penghantaran atau beberapa chuck sebelum dan selepas data yang perlu dinyahmampat , ia boleh dipertimbangkan)
Soalan 2 :
Jika anda tidak boleh menyahmampat dengan betul setiap bahagian data yang diterima, bagaimana anda boleh menyahmampat data sebanyak mungkin?

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(2)
女神的闺蜜爱上我

Saya rasa kita boleh membuat fungsi untuk menyambung semula penghantaran apabila ralat berlaku. Anda perlu menilai sama ada aliran data semasa dihantar sepenuhnya. Ini memerlukan protokol penghantaran antara pemancar dan penerima boleh diubah oleh anda Jika ralat berlaku, gagal akan dilaporkan kepada pemancar dengan segera dilaporkan dan bahagian seterusnya akan dihantar. Ini memastikan integriti data. Jika fail terlalu besar, anda boleh menyandarkan lebih banyak segmen data dalam ingatan dan membuat pertimbangan terperinci.

某草草

Tidak pasti tentang masalah yang anda huraikan, tetapi beberapa soalan dan jawapan tentang stackoverflow mungkin membantu.

  • Bagaimana saya boleh menyahmampat strim gzip dengan zlib?

  • Python nyahmampat gzip ketul demi ketul

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan