我最近编写了这个代码来梳理数据点,它可以很好地处理小数据集。然而,每当数据集变得太大时,我得到的是垃圾输出和pycharm控制台中的一条消息,其中显示! Too much output to process
。然后最大线输出似乎是大约55,000行。
此代码的要点是分析file1中坐标与file2中所有元素的接近程度。然后返回任何匹配的坐标匹配的匹配。正如您将在下面看到的,我编写了一个嵌套的for循环来执行此操作,我理解这可能是一种暴力策略,以便以后可能成为获取错误消息的问题?
下面是代码:
import numpy as np
import math as ma
filename1 = "C:\Users\Justin\Desktop\file1.data"
data1 = np.genfromtxt(filename1,
skip_header=1,
usecols=(0, 1))
#dtype=[
#("x1", "f9"),
#("y1", "f9")])
#print "data1", data1
filename2 = "C:\Users\Justin\Desktop\file2.data"
data2 = np.genfromtxt(filename2,
skip_header=1,
usecols=(0, 1))
#dtype=[
#("x2", "f9"),
#("y2", "f9")])
#print "data2",data2
def d(a,b):
d = ma.acos(ma.sin(ma.radians(a[1]))*ma.sin(ma.radians(b[1]))
+ma.cos(ma.radians(a[1]))*ma.cos(ma.radians(b[1]))* (ma.cos(ma.radians((a[0]-b[0])))))
return d
results = open("results.txt", "w")
for coor1 in data1:
for coor2 in data2:
n=0
a = [coor1[0], coor1[1]]
b = [coor2[0], coor2[1]]
#print "a", a
#print "b", b
if d(a, b) < 0.07865: # if true what happens
results.write("\t".join([str(coor1), str(coor2), "True", str(d)]) + "\n")
else:
results.write("\t".join([str(coor1), str(coor2), "False", str(d)]) + "\n")
results.close()
理想情况下,当我开始交叉检查每个超过500,000个坐标的数据文件时,我不会遇到这个问题,因为我怀疑它们中的许多会分享很多接近度。
但是有两个原因可以发布这个(再次)。首先,与任何可以使用它的人共享此代码,因为它已被证明是分析任意球形空间中的数据或坐标的强大工具。其次,看看是否有人就如何提高效率并帮助我解决错误信息提出任何建议?
最明确的是,当我的邻近限制是一个巨大的分离以及读取两个元素时,会出现错误消息&#34; a&#34;和&#34; b&#34;。
我真的怀疑pycharm处理超过55,000行输出的问题,但我不知道......我的猜测是我要么破坏代码,要么可能是Windows 10的问题?
提前感谢您的帮助。我对此很新,所以任何建议肯定都会有用。
答案 0 :(得分:2)
正如dblclik在他对该帖子的评论中提到的那样,有一些方法可以使你的代码更有效,避免了嵌套for循环的完整计算。但是,我认为这不会帮助您解决错误消息:
我不认为PyCharm在处理n行代码时有一个问题,因为你提到,我更确切地说,这是事实,你正在打印,即输出,所有人输出到PyCharm,特别是在打印不太接近的xy的距离时需要记忆。
我建议您不要打印结果,而是尝试将其保存到.txt文件或距离矩阵中。通过这种方式,您还可以保存计算输出!
示例:将结果保存到列表
results = []
...
for coor1 in data1:
for coor2 in data2:
distance = d(a, b)
if distance < thresh:
results.append((str(coor1), str(coor2), "True", str(distance)))
else:
results.append((str(coor1), str(coor2), "False", str(distance)))
示例:保存到文本文件
results = open("results.txt", "w")
...
for coor1 in data1:
for coor2 in data2:
distance = d(a, b)
if distance < thresh:
results.write("\t".join([str(coor1), str(coor2), "True", str(distance)])+"\n")
else:
results.write("\t".join([str(coor1), str(coor2), "False", str(distance)])+"\n")
results.close()
我希望这种方法可以帮助您完全运行脚本!