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 很大(很多命中),则大致相同(甚至更慢)。