【发布时间】:2015-02-24 16:05:49
【问题描述】:
我有一个包含大量数据 (3 GB) 的文本文件。此文本文件的每一行都包含时间、源 IP、目标 IP 和大小。如您所知,IP 地址最后一部分中的数字显示端口地址。我想将这些端口地址带到一个直方图中,我为 10 000 行数据做了它,但我猜到 Python 代码无法为大量数据执行。我简要解释一下我编写的代码。首先,我读取了 10 000 个数据点,然后我将它们拆分并放入一个名为 Everything_list 的列表中。只需忽略 while 循环起作用的条件。后来我把所有的端口地址放在一个列表中,然后画出它们的直方图。 现在假设我有一百万条数据线,我一开始就无法读取它们,更不用说对它们进行分类了。有些人告诉我使用数组,有些人告诉我处理一大块数据,然后再处理另一块数据。我对所有人所说的感到困惑。有人可以帮我解决这个问题吗?
text_file = open("test.data", "r")
a = text_file.read()
text_file.close()
everything_list = a.split()
source_port_list = []
i=0
while 6+7*i<len(everything_list):
source_element = everything_list[2+7*i]
source_port_position = source_element.rfind('.')
source_port_number = int(source_element[source_port_position + 1:])
source_port_list.append(source_port_number)
i=i+1
import matplotlib.pyplot as plt
import pylab
numBins = 20
plt.hist(source_port_list, numBins, color='red', alpha=0.8)
plt.show()
这是行格式:
15:42:42.719063 IP 129.241.138.133.47843 > 129.63.27.12.2674: tcp 1460
15:42:42.719205 IP 129.241.138.133.47843 > 129.63.27.12.2674: tcp 1460
15:42:42.719209 IP 129.63.57.175.45241 > 62.85.5.142.55455: tcp 0
15:42:42.719213 IP 24.34.41.8.1236 > 129.63.1.23.443: tcp 394
15:42:42.719217 IP 59.167.148.152.25918 > 129.63.57.40.36075: tcp 0
15:42:42.719260 IP 129.63.223.16.2823 > 80.67.87.25.80: tcp 682
15:42:42.719264 IP 129.63.184.118.2300 > 64.111.215.46.80: tcp 0
15:42:42.719269 IP 129.63.184.118.2300 > 64.111.215.46.80: tcp 0
【问题讨论】:
-
你有多少内存将决定你可以在内存中存储多少,实际ip中的最后一位数字与端口无关
-
你能转储你的源文件的一些行,以获得确切的结构吗?
-
@PadraicCunningham 我想他的意思是
127.0.0.1:8080例如 -
无论如何将整个文件读入内存是错误的方法,遍历文件对象并逐行解析,这将立即节省一些演出
-
我认为如果你只是遍历文件对象,你的很多问题都会消失。您可以完全按照您的问题添加文件的 sn-p,很难在您的评论中看到实际格式
标签: python text-files histogram large-data