Python:迭代大文件
Python: Iterating Large Files
我是初学者,如果有任何替代方法可以解决我的问题,我将不胜感激。简而言之,我有两个文件,每个文件包含一个向量。目标是从文件 1 中减去文件 2 的所有元素;对于所有可能的组合。对于小向量,一切都很好,一切都很好,但是对于更大的文件,例如每个文件中有百万个元素,处理时间是巨大的。
下面给出了最小的工作示例。我听说过内存映射,如果您能分享修改后的版本或任何相关的指针来处理这个问题,我将不胜感激。
import matplotlib.pyplot as plt
import numpy as np
file1 = np.loadtxt('File_1.txt',delimiter=',')
file2 = np.loadtxt('File_2.txt',delimiter=',')
event1 = file1[:,1]
event2 = file2[:,1]
r1 = len(event1)
r2 = len(event2)
diff = []
for i in range(0,r1):
for j in range(0,r2):
delta = float(event1[i]-event2[j])
if delta >=-4000 and delta <=4000:
diff = np.append(diff, delta)
np.savetxt('export.txt', diff)
这可能有点帮助。
import numpy as np
file1 = np.loadtxt('File_1.txt', delimiter=',')
file2 = np.loadtxt('File_2.txt', delimiter=',')
event1 = file1[:, 1]
event2 = file2[:, 1]
diff = []
for item in event2:
event_delta = event1 - item
event_delta_filter = list(filter(lambda x: -4000 <= x <= 4000, event_delta))
diff = np.append(diff, event_delta_filter)
print(diff)
这是一个 O(n log m + number_of_matches) 的解决方案。这仍然可以默认回到 O(n*m) 因为可能的输出数量很大(如果所有元素的值彼此接近)。如果匹配项很少,这会快得多:
#two pointer approach
event1 = sorted(event1)
event2 = sorted(event2)
diff = []
#smallest
if len(event1) > len(event2):
event1, event2 = event2,event1
left = 0
right = 0
for e in event1:
# move left pointer so that is within -delta of e
while left < len(event2) and event2[left] - e < -4000:
left +=1
#move right pointer so that is outside of +delta
while right < len(event2) and event2[right] - e <= 4000:
right +=1
for i in range(left,right):
diff.append(e - event2[i])
在我的机器上测试,这比示例文件快了大约 6 倍。如果 delta 与数字(很少命中)相比相对较小,速度会快得多,如果 delta 很大(很多命中),则大致相同(甚至更慢)。
我是初学者,如果有任何替代方法可以解决我的问题,我将不胜感激。简而言之,我有两个文件,每个文件包含一个向量。目标是从文件 1 中减去文件 2 的所有元素;对于所有可能的组合。对于小向量,一切都很好,一切都很好,但是对于更大的文件,例如每个文件中有百万个元素,处理时间是巨大的。
下面给出了最小的工作示例。我听说过内存映射,如果您能分享修改后的版本或任何相关的指针来处理这个问题,我将不胜感激。
import matplotlib.pyplot as plt
import numpy as np
file1 = np.loadtxt('File_1.txt',delimiter=',')
file2 = np.loadtxt('File_2.txt',delimiter=',')
event1 = file1[:,1]
event2 = file2[:,1]
r1 = len(event1)
r2 = len(event2)
diff = []
for i in range(0,r1):
for j in range(0,r2):
delta = float(event1[i]-event2[j])
if delta >=-4000 and delta <=4000:
diff = np.append(diff, delta)
np.savetxt('export.txt', diff)
这可能有点帮助。
import numpy as np
file1 = np.loadtxt('File_1.txt', delimiter=',')
file2 = np.loadtxt('File_2.txt', delimiter=',')
event1 = file1[:, 1]
event2 = file2[:, 1]
diff = []
for item in event2:
event_delta = event1 - item
event_delta_filter = list(filter(lambda x: -4000 <= x <= 4000, event_delta))
diff = np.append(diff, event_delta_filter)
print(diff)
这是一个 O(n log m + number_of_matches) 的解决方案。这仍然可以默认回到 O(n*m) 因为可能的输出数量很大(如果所有元素的值彼此接近)。如果匹配项很少,这会快得多:
#two pointer approach
event1 = sorted(event1)
event2 = sorted(event2)
diff = []
#smallest
if len(event1) > len(event2):
event1, event2 = event2,event1
left = 0
right = 0
for e in event1:
# move left pointer so that is within -delta of e
while left < len(event2) and event2[left] - e < -4000:
left +=1
#move right pointer so that is outside of +delta
while right < len(event2) and event2[right] - e <= 4000:
right +=1
for i in range(left,right):
diff.append(e - event2[i])
在我的机器上测试,这比示例文件快了大约 6 倍。如果 delta 与数字(很少命中)相比相对较小,速度会快得多,如果 delta 很大(很多命中),则大致相同(甚至更慢)。