java - Comment décompresser les données de certains blocs de données individuels d'un fichier GZIP lors de sa diffusion?
PHP中文网
PHP中文网 2017-06-12 09:25:31
0
2
1242

Description de la scène :

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

Le problème maintenant est que, comme ce qui est reçu n'est pas un fichier compressé complet mais un bloc de données binaires, les données reçues ne peuvent pas être décompressées en raison d'informations incomplètes

Maintenant, je souhaite implémenter cette fonction : décompressez d'abord les données du flux reçu et restaurez-les en données complètes (les données du journal d'origine sont séparées par des caractères de nouvelle ligne, ce serait bien d'obtenir le texte avant la compression de chaque données de flux et le décalage de le fichier correspondant), puis considérez que des processus tels que la transmission et le stockage peuvent provoquer des erreurs de données, donc pour chaque flux de données, décompressez un maximum de données en cas d'erreurs.

Une partie du code pertinent est la suivante : (modifié depuis 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()

Lorsque i>=3, une erreur est signalée à chaque fois dans la boucle
Ma conclusion est que si le flux est discontinu (saut pour recevoir une partie des données), alors les données suivantes ne peuvent pas être décompressées.
Question 1 : Comment décompresser correctement chaque partie des données reçues ? (Parce que cela peut impliquer l'algorithme et la structure des données de la compression gzip, je regarde le code correspondant. Si le problème peut être résolu en ajoutant un certain mandrin dans l'en-tête de transmission ou un mandrin avant et après les données qui doivent être décompressées. , c'est bon)
Question 2 :
Si vous ne pouvez pas décompresser correctement chaque partie des données reçues, comment pouvez-vous décompresser autant de données que possible ?

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(2)
女神的闺蜜爱上我

Je pense que nous pouvons créer une fonction pour reprendre la transmission lorsqu'une erreur se produit. Sauvegardez le flux de données actuel avant la transmission. Vous devez juger si le flux de données actuel est complètement transmis. Cela nécessite que le protocole de transmission entre l'émetteur et le récepteur puisse être modifié par vous. Si une erreur se produit, un échec sera immédiatement signalé à l'émetteur. La transmission reprendra à partir de la section précédente. S'il n'y a pas d'erreur, OK. sera signalé et la section suivante sera transmise. Cela garantit l’intégrité des données. Si le fichier est trop volumineux, vous pouvez sauvegarder davantage de segments de données en mémoire et porter des jugements détaillés.

某草草

Je ne suis pas sûr du problème que vous décrivez, mais quelques questions et réponses sur stackoverflow peuvent être utiles.

  • Comment décompresser un flux gzip avec zlib ?

  • Python décompressant gzip morceau par morceau

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal