zoukankan      html  css  js  c++  java
  • 使用python读取大文件

    python中读取数据的时候有几种方法,无非是read,readline,readlings和xreadlines几种方法,在几种方法中,read和xreadlines可以作为迭代器使用,从而在读取大数据的时候比较有效果.

    在测试中,先创建一个大文件,大概1GB左右,使用的程序如下:

    import os.path
    import time
    while os.path.getsize('messages') <1000000000:
        f = open('messages','a')
        f.write('this is a file/n')
        f.close()
    
    print 'file create complted'

    在这里使用循环判断文件的大小,如果大小在1GB左右,那么结束创建文件。--需要花费好几分钟的时间。


    测试代码如下:

    #22s
    start_time = time.time()
    f = open('messages','r')
    for i in f:
        end_time = time.time()
        print end_time - start_time
        break
    f.close()
    
    #22s
    start_time = time.time()
    f = open('messages','r')
    for i in f.xreadlines():
        end_time = time.time()
        print end_time - start_time
        break
    f.close()
    
    
    start_time = time.time()
    f = open('messages','r')
    k= f.readlines()
    f.close()
    end_time = time.time()
    print end_time - start_time

    使用迭代器的时候,两者的时间是差不多的,内存消耗也不是很多,使用的时间大概在22秒作用

    在使用完全读取文件的时候,使用的时间在40s,并且内存消耗相当严重,大概使用了1G的内存。。


    其实,在使用跌倒器的时候,如果进行连续操作,进行print或者其他的操作,内存消耗还是不可避免的,但是内存在那个时候是可以释放的,从而使用迭代器可以节省内存,主要是可以释放。

    而在使用直接读取所有数据的时候,数据会保留在内存中,是无法释放这个内存的,从而内存卡死也是有可能的。


    在使用的时候,最好是直接使用for i in f的方式来使用,在读取的时候,f本身就是一个迭代器,其实也就是f.read方法



  • 相关阅读:
    Cisco网络模拟器踩坑记录
    PAT甲级1009水题飘过
    PAT甲级1011水题飘过
    springmvc中项目启动直接调用方法
    Eclipse中Java文件图标由实心J变成空心J的问题
    mysql求时间差
    maven常用命令
    java单例模式(两种常用模式)
    mybatis一对多,多对一
    mybatis简介
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525022.html
Copyright © 2011-2022 走看看