海量数据寻找出现频率最多的topN,且内存受到限制,该如何处理呢?主要思想就是分治。如果使用框架处理,hadoop的MapReduce运算框架是可以解决的,且是分布式的处理。但是单机版该如何处理呢。空闲时间使用python3实现了一版,做一下记录。
import collections
import re
import sys
import time
"""
找出一个超大文件中出现频率最高的100个词
这里使用分治的方式先将大文件拆分为多个小文件,比如这里将大文件拆分为100个小文件。
需要思考的问题是每个小文件,需要选择前多少位的数据作为下次排序的数据呢?
"""
def split4():
"""
如果是文本文件,可以使用逐行读取。
但是逐行读取的速度是比较慢的。所以内存不是特别小的情况下,可以使用批量读取。速度要快N倍
"""
with open("E:/a/english.txt", "r", encoding="UTF-8") as f:
i = 0
file_writer = open('E:/a/0.txt', 'a', encoding="UTF-8");
while True:
# buff = f.readline()
# 如果是大文件,需要将这里的缓冲区设置大些,否则文件切分会消耗比较多的时间
buff = f.read(1024 * 1024)
if buff:
if i < 100:
# 先将列表中第一个元素写入文件中
file_writer.write(buff);
# 关闭当前句柄
file_writer.close();
# 重新创建一个新的句柄,等待写入下一个切