gzip在写入大量数据时失败

2024-04-20 05:15:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大的gzip压缩文件。 我写了一段代码把这些文件分成更小的文件。我可以指定 每个文件的行数。问题是我最近增加了每个分割线的数量 当我处理更大的文件时,不会发生拆分。有时是一个小文件 成功生产,有时一个生产,但重量只有40或50磅,这是 失败。我试图通过查看gzip中出现的异常来捕捉异常 代码。所以我的代码是这样的:

def writeGzipFile(file_name, content):
    import gzip
    with gzip.open(file_name, 'wb') as f:
        if not content == '':
            try:
                f.write(content)
            except IOError as ioe:
                print "I/O ERROR wb", ioe.message
            except ValueError as ve:
                print "VALUE ERROR wb: ", ve.message
            except EOFError as eofe:
                print "EOF ERROR wb: ", eofe.message
            except:
                print "UNEXPECTED ERROR wb"

问题是当内容太高时,相关的行数,我经常得到 “意外错误”消息。所以我不知道这是哪种错误。在

最后我发现行数是问题所在,而且python的gzip似乎无法同时在一个文件中写入如此多的数据。将每个分段的生产线数量减少到4000000个工程。不过,我想拆分内容,并按顺序写入一个文件,以确保即使是高数据内容也能被写入。在

因此,我想知道如何使用gzip找出一个文件中可以一次性写入的最大字符数,而不会出现任何错误。在


编辑1

因此,我查看了所有剩余的异常(我不知道可以简单地捕获Exception对不起):

^{pr2}$

错误大约是int大小。我从没想过有一天我会超过int尺寸:

EXCEPTION: size does not fit in an int
TRACEBACK_1:Traceback (most recent call last):
  File "/home/anadin/dev/illumina-project-restructor_mass-splitting/illumina-project-restructor/tools/file_utils/file_compression.py", line 131, in writeGzipFile
    f.write(content)
  File "/usr/local/cluster/python2.7/lib/python2.7/gzip.py", line 230, in write
    self.crc = zlib.crc32(data, self.crc) & 0xffffffffL
OverflowError: size does not fit in an int
None

一个int的最大大小是2147483647,根据我的日志,我的数据块大约是3854674090。这个块是我应用了__len__()函数的字符串。在

因此,正如我计划的那样,正如anttihaapala建议的那样,我将一次读取较小的块,以便按顺序将它们写入较小的文件中。在


Tags: 文件代码inas错误noterrorcontent
1条回答
网友
1楼 · 发布于 2024-04-20 05:15:04

无论如何,我怀疑原因是某种内存不足的错误。我不太清楚为什么不一次写更少的数据;这里使用chunks方法from this answer

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

...
with gzip.open(file_name, 'wb') as f:
    for chunk in chunks(content, 65536):
        f.write(chunk)

也就是说,你要像吃大象一样,一次咬一口。在

相关问题 更多 >