Python 读取大文件(相关总结)

Python 读取 超大文本会带来 以下问题:

1、内存溢出;

2、处理效率低;

处理问题1的思路有如下几种方案:

1、分块读取。

    1) read()函数会将数据一次性读取到内存中,可通过将数据分块读取,readline()函数逐行读取;

    2) 一次限制读取的文件的大小,利用iter和yield来控制每次读取的文件位置;

# 利用生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成
# yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始
def read_in_blocks(file_obj, block_size = 2048):
    """
    逐件读取文件
    默认块大小:2KB
    """
    while True:
        data = file_obj.read(block_size)  # 每次读取指定的长度
        if not data:
            break
        yield data


with open('filename', 'r', encoding = 'utf-8') as f:
    for chuck in read_in_blocks(f):
        do_something(block)

  3)利用python自带的解释器工具,利用with语句句柄负责打开和关闭文件(包括在内部块中引发异常时),for line in f 将文件对象 f 视为一个可迭代的数据类型,会自动使用 IO 缓存和内存管理,这样就可以处理大数据文件。

2、存入数据库中进行进一步处理

3、利用pandas库来进行处理read_csv(),利用Dataframe数据格式来处理,一个dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。可以把它想象成一个series的字典项。另一种series是一个一维的数据类,类似于一个list。

    不过一般来说,用pandas处理小于100兆的数据,性能不是问题。当用pandas来处理100兆至几个G的数据时,将会比较耗时,同时会导致程序因内存不足而运行失败。

# python 读取亿级数据代码
# Pandas提供了IO工具可以将大文件分块读取
# 使用不同分块大小来读取再调用 pandas.concat 连接DataFrame,chunkSize设置在1000万条左右速度优化比较明显。
# 实验结果足以说明,在非">5TB"数据的情况下,Python适合做统计分析。

# encoding: utf-8
import sys
import time
import pandas as pd

t1=time.time()

reader = pd.read_csv('C:/taobao/22.csv', iterator=True)

loop = True
chunkSize =10000000
chunks = []
while loop:
    try:
        chunk = reader.get_chunk(chunkSize)
        chunks.append(chunk)
    except StopIteration:
        loop = False
        print "Iteration is stopped."
df = pd.concat(chunks, ignore_index=True)
print df
t2=time.time()
print u'总共耗时:' + str(t2 - t1) + 's'

4、更加复杂和大量的数据可以借助于spark,其中spark不支持标准的json格式,仅支持单条数据为json格式。

你可能感兴趣的:(大数据技术)