Python大厂面试题:假设有100G的访问日志文件(每行记录一个IP地址),内存只有4G,如何统计出访问次数最多的10个IP?
大家好我是锋哥。今天分享关于【Python大厂面试题假设有100G的访问日志文件每行记录一个IP地址内存只有4G如何统计出访问次数最多的10个IP】面试题。希望对大家有帮助Python大厂面试题假设有100G的访问日志文件每行记录一个IP地址内存只有4G如何统计出访问次数最多的10个IP在内存有限的情况下处理 100G 访问日志文件时不能将整个文件加载到内存中。我们可以使用外部排序和哈希映射等方法来处理这种大数据量的情况。以下是解决方案的基本步骤思路分块处理由于内存有限不能将整个日志文件一次性加载到内存。我们可以将日志文件按行处理并在内存中存储 IP 地址及其访问次数达到一定内存阈值后将当前数据保存到磁盘。外部排序将所有的 IP 访问次数计算出来后我们需要将统计结果按次数排序。由于数据量过大无法全部加载到内存中我们需要使用外部排序如将数据分块并多次排序合并。优先队列/堆为了获取访问次数最多的 10 个 IP我们可以使用一个最小堆来实时保存当前最大的 10 个 IP。解决步骤遍历文件并计算每个 IP 的访问次数通过哈希表存储 IP 和访问次数。使用外部存储当内存不足时将部分数据写入磁盘。合并排序最后读取所有计算结果并排序找出访问次数最多的 10 个 IP。Python 代码实现import heapq from collections import defaultdict def process_logs(file_path, memory_limit4 * 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(reverseTrue, keylambda 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(fIP: {ip}, Count: {count})解释process_logs该函数负责读取日志文件中的每一行IP 地址并通过defaultdict(int)统计每个 IP 的访问次数。当内存中的数据量接近memory_limit时调用save_to_disk将当前数据写入磁盘并清空内存中的数据。save_to_disk该函数将内存中的 IP 访问次数写入到一个临时文件temp_ip_counts.txt。get_top_10_ips该函数读取所有磁盘上的 IP 访问次数使用一个最小堆heapq来跟踪访问次数最多的前 10 个 IP。每次从磁盘中读取一条记录如果堆中元素少于 10 个直接插入堆。如果堆已满且当前访问次数大于堆中的最小值则替换堆中的最小值。heapqPython 提供的heapq模块用于高效地维护堆。堆是一种可以快速访问最小或最大元素的数据结构这里使用最小堆来保存访问次数最多的前 10 个 IP。优点内存控制采用分块处理数据可以在内存有限的情况下处理大规模日志文件。高效使用堆来实时更新访问次数最多的 10 个 IP避免了每次都进行排序提升了效率。处理大规模数据该方法适合处理大文件如 100G 的日志文件。外部排序和分块存储使得我们能在内存不足时仍然高效处理数据。

相关新闻

技术日报|WiFi无摄像头穿墙追踪四日称霸日增4419星,阿里AI沙箱OpenSandbox稳居第二

技术日报|WiFi无摄像头穿墙追踪四日称霸日增4419星,阿里AI沙箱OpenSandbox稳居第二

🌟 TrendForge 每日精选 - 发现最具潜力的开源项目 📊 今日共收录 10 个热门项目,涵盖 51 种编程语言🌐 智能中文翻译版 - 项目描述已自动翻译,便于理解🏆 今日最热项目 Top 10 🥇 ruvnet/RuVie…

2026/7/6 1:02:14 阅读更多 →
闭眼入! 更贴合继续教育的降AIGC平台,千笔 VS 灵感风暴AI

闭眼入! 更贴合继续教育的降AIGC平台,千笔 VS 灵感风暴AI

在AI技术迅速发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提高效率、拓展思路。然而,随着学术审核标准的不断提升,AI生成内容的痕迹越来越容易被检测出来,论文中的“AI率超标”问题也日益突出。许…

2026/5/17 7:56:52 阅读更多 →
对比一圈后!万众偏爱的一键生成论文工具 —— 千笔ai写作

对比一圈后!万众偏爱的一键生成论文工具 —— 千笔ai写作

你是否曾为论文选题发愁,反复修改却总对表达不满意?面对海量文献无从下手,格式排版总出错,查重率又让人焦虑不已?论文写作的每一个环节都像一场“硬仗”,让无数学生倍感压力。但今天,我们为你带…

2026/7/5 11:16:58 阅读更多 →

最新新闻

避开 Playwright 常见陷阱,让你的 UI 测试更快更稳

避开 Playwright 常见陷阱,让你的 UI 测试更快更稳

做UI自动化测试的朋友应该都有过这种体验——本地跑得好好的,一上CI就挂;周一全绿,周二莫名其妙红一片;加了sleep能过,不加就报元素找不到。 如果你也遇到过这些情况,别急着怀疑是自己的代码写得不够好。很…

2026/7/6 2:57:57 阅读更多 →
AI Agent Skills:从代码补全到智能开发的效率革命

AI Agent Skills:从代码补全到智能开发的效率革命

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你还在用 AI 编程助手只是让它帮你补全代码行,那你可能只发挥了它 10% 的潜力。真正的效率革命,发生在你教…

2026/7/6 2:57:57 阅读更多 →
SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024容器化架构深度解析:10个核心容器如何构建下一代云网络1. 现代网络操作系统的容器化革命当微软在2016年首次开源SONiC项目时,很少有人能预料到这个基于Linux的网络操作系统会彻底改变数据中心网络的构建方式。八年后的今天,SONiC已…

2026/7/6 2:55:56 阅读更多 →
QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造

QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造

QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造 摘要:QooBot 是一个面向仿生人的开源全栈生态,涵盖从机械图纸、电路设计到操作系统、AI 算法的完整技术栈。本文从架构全景、大脑核心、推理引擎、开发者生态等维度全面解读…

2026/7/6 2:53:55 阅读更多 →
可变级数LC无源自均压海量级联多电平拓扑机理研究——代替传统LCC/MMC的新一代特高压直流逆变架构

可变级数LC无源自均压海量级联多电平拓扑机理研究——代替传统LCC/MMC的新一代特高压直流逆变架构

可变级数LC无源自均压海量级联多电平拓扑机理研究——取代传统LCC/MMC的新一代特高压直流逆变架构 ----------作者:杨连江 摘要 针对我国特高压直流输电现有两大技术体系(LCC电网换相直流、MMC柔性直流)存在的底层机理缺陷,本文提…

2026/7/6 2:53:55 阅读更多 →
卡梅德生物技术快报| KM13 辅助噬菌体的天然 VHH 噬菌体文库全套构建流程与数据验证

卡梅德生物技术快报| KM13 辅助噬菌体的天然 VHH 噬菌体文库全套构建流程与数据验证

一、提出问题:实验室自建纳米抗体文库常遇四大工程化痛点 食品检测实验室自主构建 VHH 噬菌体文库时,普遍存在工程化落地难题:其一,普通单轮 PCR 扩增 VHH 基因存在大量缺失,文库多样性不足;其二&#xff…

2026/7/6 2:51:55 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻