当前位置: 首页 > news >正文

Python大厂面试题:假设有100G的访问日志文件(每行记录一个IP地址),内存只有4G,如何统计出访问次数最多的10个IP?

大家好,我是锋哥。今天分享关于【Python大厂面试题:假设有100G的访问日志文件(每行记录一个IP地址),内存只有4G,如何统计出访问次数最多的10个IP?】面试题。希望对大家有帮助;

Python大厂面试题:假设有100G的访问日志文件(每行记录一个IP地址),内存只有4G,如何统计出访问次数最多的10个IP?

在内存有限的情况下,处理 100G 访问日志文件时不能将整个文件加载到内存中。我们可以使用外部排序哈希映射等方法来处理这种大数据量的情况。以下是解决方案的基本步骤:

思路:

  1. 分块处理:由于内存有限,不能将整个日志文件一次性加载到内存。我们可以将日志文件按行处理,并在内存中存储 IP 地址及其访问次数,达到一定内存阈值后将当前数据保存到磁盘。
  2. 外部排序:将所有的 IP 访问次数计算出来后,我们需要将统计结果按次数排序。由于数据量过大,无法全部加载到内存中,我们需要使用外部排序(如将数据分块并多次排序合并)。
  3. 优先队列/堆:为了获取访问次数最多的 10 个 IP,我们可以使用一个最小堆来实时保存当前最大的 10 个 IP。

解决步骤:

  1. 遍历文件并计算每个 IP 的访问次数:通过哈希表存储 IP 和访问次数。
  2. 使用外部存储:当内存不足时,将部分数据写入磁盘。
  3. 合并排序:最后,读取所有计算结果并排序,找出访问次数最多的 10 个 IP。

Python 代码实现:

import heapq from collections import defaultdict def process_logs(file_path, memory_limit=4 * 1024 * 1024 * 1024): # 创建一个字典来存储 IP 访问次数 ip_counts = defaultdict(int) # 打开日志文件进行逐行读取 with open(file_path, 'r') as f: for line in f: ip = line.strip() # 假设每行是一个IP地址 ip_counts[ip] += 1 # 当内存使用接近上限时,进行内存回收 if len(ip_counts) * ip_counts.__sizeof__() > memory_limit: save_to_disk(ip_counts) ip_counts.clear() # 将剩余数据存到磁盘 if ip_counts: save_to_disk(ip_counts) def save_to_disk(ip_counts): # 将当前内存中的 IP 访问次数保存到磁盘 with open('temp_ip_counts.txt', 'a') as temp_file: for ip, count in ip_counts.items(): temp_file.write(f"{ip}\t{count}\n") def get_top_10_ips(file_path): # 用一个最小堆来存储访问次数最多的前10个IP heap = [] # 读取存储在磁盘上的数据进行处理 with open(file_path, 'r') as temp_file: for line in temp_file: ip, count = line.strip().split('\t') count = int(count) # 如果堆未满,直接加入堆 if len(heap) < 10: heapq.heappush(heap, (count, ip)) else: # 如果当前访问次数大于堆中最小的访问次数,替换最小值 if count > heap[0][0]: heapq.heapreplace(heap, (count, ip)) # 排序堆中的元素,按访问次数降序 heap.sort(reverse=True, key=lambda x: x[0]) return heap # 假设日志文件路径为 logs.txt log_file_path = 'logs.txt' # 处理日志文件并将 IP 访问次数写入磁盘 process_logs(log_file_path) # 获取访问次数最多的 10 个 IP top_10_ips = get_top_10_ips('temp_ip_counts.txt') # 打印结果 print("Top 10 most visited IPs:") for count, ip in top_10_ips: print(f"IP: {ip}, Count: {count}")

解释:

  1. process_logs:该函数负责读取日志文件中的每一行(IP 地址),并通过defaultdict(int)统计每个 IP 的访问次数。当内存中的数据量接近memory_limit时,调用save_to_disk将当前数据写入磁盘,并清空内存中的数据。
  2. save_to_disk:该函数将内存中的 IP 访问次数写入到一个临时文件temp_ip_counts.txt
  3. get_top_10_ips:该函数读取所有磁盘上的 IP 访问次数,使用一个最小堆(heapq)来跟踪访问次数最多的前 10 个 IP。每次从磁盘中读取一条记录,如果堆中元素少于 10 个,直接插入堆。如果堆已满且当前访问次数大于堆中的最小值,则替换堆中的最小值。
  4. heapq:Python 提供的heapq模块用于高效地维护堆。堆是一种可以快速访问最小(或最大)元素的数据结构,这里使用最小堆来保存访问次数最多的前 10 个 IP。

优点:

处理大规模数据:

http://www.jsqmd.com/news/434629/

相关文章:

  • 2026年3月高可复性离子通道检测厂家推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • UE5.7编辑器扩展
  • 2026年 广州工商财税服务推荐榜单:专业代办公司注册、记账报税、地址挂靠及变更注销全流程解析 - 品牌企业推荐师(官方)
  • 2026年工业洗衣机厂家推荐榜单:洗脱机、洗衣房设备,高效耐用与节能创新技术深度解析 - 品牌企业推荐师(官方)
  • 2026年 PVDF管材/管件/阀门厂家实力推荐榜:耐腐蚀、高纯度工业流体输送解决方案优选 - 品牌企业推荐师(官方)
  • 市场调查与分析笔记
  • PHP通过Thrift操作Hbase
  • 一天一个Python库: yarl - 强大且灵活的URL解析与构建工具
  • 题解:蓝桥云课 2096 顺子日期
  • 万里通积分卡回收是否值得?深度分析与实用攻略 - 团团收购物卡回收
  • AI基础建设催涨DRAM,创富国际成为投资科技股首选 - 速递信息
  • 2026年 润滑脂厂家推荐排行榜,工业/合成/特种润滑脂,高温/低温/极压/抗水/齿轮/密封/全氟聚醚润滑脂,专业润滑解决方案供应商精选 - 品牌企业推荐师(官方)
  • 蓝桥杯省赛无忧班(Python组)(配套习题)
  • 聊聊南昌电动伸缩门定制服务,价格合理且靠谱的厂家推荐有哪些? - mypinpai
  • 2026热门一站式资质代理代办机构推荐榜 - 优质品牌商家
  • 2026年3月PCB设计厂家推荐,电路板设计制作优质服务商 - 品牌鉴赏师
  • 北京上门收茅台|京城亚南酒业专业鉴藏,让茅台变现更安心 - 品牌排行榜单
  • 2026年3月北京智能通风柜厂家推荐,物联网智能控制通风设备 - 品牌鉴赏师
  • 解锁论文写作新境界:书匠策AI,你的课程论文智慧伙伴
  • 解锁论文写作新姿势:书匠策AI,你的课程论文智囊团!
  • 万爱通礼品卡回收全流程详解:从选择平台到到账细节 - 团团收购物卡回收
  • 2026年3月EPE珍珠棉厂家推荐榜,彰显国产技术实力 - 品牌鉴赏师
  • 2026年3月盘式干燥机厂家推荐,精准检测与稳定性能解析 - 品牌鉴赏师
  • 书匠策AI:课程论文的“智能导航仪”,让学术探索之旅畅通无阻
  • 2026年3月管道式密度计厂家推荐,管路安装式密度测量设备 - 品牌鉴赏师
  • 支付宝红包能否回收?分期乐用户必读的实战经验! - 团团收购物卡回收
  • 题解:蓝桥云课 191 特别数的和
  • 题解:蓝桥云课 4983 妮妮的翻转游戏
  • 2026北京财税公司top6口碑推荐|工商注册代理记账股权转让代办机构推荐 - 品牌智鉴榜
  • 分期乐支付宝红包回收全攻略,让你的福利最大化! - 团团收购物卡回收