大家好我是锋哥。今天分享关于【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 的日志文件。外部排序和分块存储使得我们能在内存不足时仍然高效处理数据。