首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python读取大型二进制文件的一部分

Python读取大型二进制文件的一部分
EN

Stack Overflow用户
提问于 2018-07-28 18:34:45
回答 2查看 1.5K关注 0票数 0

我有很大的二进制文件(大小约2.5)。它包含报头(大小为336字节)和int32类型的地震信号数据(x、y和z通道)。离散计数为223 200 000。我需要读一部分信号。例如,我希望得到离散间隔为216,000,219,599,999的部分信号。我写了这个函数:

代码语言:javascript
复制
def reading(path, start_moment, end_moment):
    file_data = open(path, 'rb')
    if start_moment is not None:
        bytes_value = start_moment * 4 * 3
        file_data.seek(336 + bytes_value)
    else:
        file_data.seek(336)

    if end_moment is None:
        try:
            signals = np.fromfile(file_data, dtype=np.int32)
        except MemoryError:
            return None
        finally:
            file_data.close()
    else:
        moment_count = end_moment - start_moment + 1
        try:
            signals = np.fromfile(file_data, dtype=np.int32,
                                  count=moment_count * 3)
        except MemoryError:
            return None
        finally:
            file_data.close()
    channel_count = 3
    signal_count = signals.shape[0] // channel_count
    signals = np.reshape(signals, newshape=(signal_count, channel_count))
    return signals

如果我在PyCharm集成开发环境中使用函数运行脚本,则会出现错误:

测试回溯(最近一次调用):文件“D:/AppsBuilding/

/testReadBaikal8.py”,第41行,in signal_2 =ReadBaikal8.py(path=path,start_moment=216000000,end_moment=219599999)文件"D:/AppsBuilding/test/testReadBaikal8.py",第27行,读取count=moment_count * 3) OSError:获取文件位置失败

但是如果我运行带有参数的脚本: start_moment=7200000,end_moment=10799999都可以。在我的电脑上安装了32位的Windows7。内存大小为1.95 is请帮我解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-28 18:54:18

将文件分成小段,在处理完每一小段内容后释放内存

代码语言:javascript
复制
def read_in_block(file_path):
    BLOCK_SIZE = 1024
    with open(file_path, "r") as f:
        while True:
            block = f.read(BLOCK_SIZE)  
            if block:
                yield block
            else:
                return  

        print block
票数 0
EN

Stack Overflow用户

发布于 2018-07-30 05:19:21

我不使用Numpy,但我看不出你的代码有什么明显的错误。但是,您说该文件的大小约为2.5 GB。219,599,999的三元组索引要求文件大小至少为2.45 GB:

代码语言:javascript
复制
$ calc
; 219599999 * 4 * 3
    2635199988
; 2635199988 / 1024^3
    ~2.45422123745083808899

你确定你的文件真的那么大吗?

我也不使用MS Windows,但以下玩具程序对我有效。第一种方法创建一个模仿您的结构的数据文件。第二个表明它可以读取最终的数据三元组。如果在您的系统上运行这些程序,会发生什么?

代码语言:javascript
复制
fh = open('x', 'wb')
fh.write(b'0123456789')
for i in range(0, 1000):
    s = bytes('{:03d}'.format(i), 'ascii')
    fh.write(b'a' + s + b'b' + s + b'c' + s)

从文件x读取数据

代码语言:javascript
复制
fh = open('x', 'rb')
triplet = 999
fh.seek(10 + triplet * 3 * 4)
data = fh.read(3 * 4)
print(data)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51570489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档