【发布时间】:2019-07-18 06:21:00
【问题描述】:
我有这段代码很好用,可以做我想做的事,但是它以线性形式执行,这会减慢我的数据文件的大小,所以我想将它转换为 Log。我尝试了这段代码和许多其他人在这里发布但仍然没有让它工作的运气。我将发布两组代码并举例说明我的期望。
import pandas
import fileinput
'''This code runs fine and does what I expect removing duplicates from big
file that are in small file, however it is a linear function.'''
with open('small.txt') as fin:
exclude = set(line.rstrip() for line in fin)
for line in fileinput.input('big.txt', inplace=True):
if line.rstrip() not in exclude:
print(line, end='')
else:
print('')
'''This code is my attempt at conversion to a log function.'''
def log_search(small, big):
first = 0
last = len(big.txt) - 1
while first <= last:
mid = (first + last) / 2
if str(mid) == small.txt:
return True
elif small.txt < str(mid):
last = mid - 1
else:
first = mid + 1
with open('small.txt') as fin:
exclude = set(line.rstrip() for line in fin)
for line in fileinput.input('big.txt', inplace=True):
if line.rstrip() not in exclude:
print(line, end='')
else:
print('')
return log_search(small, big)
- 大文件有数百万行 int 数据。
- 小文件有数百行 int 数据。
- 比较数据并删除大文件中的重复数据,但将行号留空。
运行第一个代码块可以,但是搜索大文件需要很长时间。也许我以错误的方式处理问题。我尝试将其转换为日志运行没有错误,但什么也没做。
【问题讨论】:
-
不太清楚。您想要将大量数字转换为二进制,还是想要执行二进制搜索来查找匹配项?对于后者,请尝试
bisect模块。 -
插入数据不是 bisect 吗?我想要做的是使用对数搜索将小文件中的数据与大文件中的数据进行比较,从大文件中删除该数据并将其替换为空行。因为大文件有数百万行,所以线性搜索需要很长时间。
-
或者我误解了你的意思。您是否要对大文件中小文件的行进行二进制搜索,即将 O(b) 转换为 O(s logb)(s 和 b 分别是小文件和大文件的大小)?我不认为这会起作用,因为在大文件中寻找下一行可能仍然是 O(b),除非你先将它存储在一个列表中,这也是 O(b)。
-
看起来像
file.seekis O(1)(至少在某些系统上?),但这会给你第 i 个字符,而不是第 i 行。您可能仍然可以使用它从该位置读取下一行,并对字符而不是行进行二进制搜索。不过,不确定覆盖行与空白行部分。 -
好的,我明白了。大列表是整数数据的有序列表。看我的代码。我想将小列表中的每个项目与大列表中点的数据进行比较。如果它是相同的删除它留下空白行。如果不一样,看看它是更小还是更大,然后消除在它不可能的大文件的 50% 中查找,然后再次拆分剩余的 50% 并查看中间点。重复,直到我找到重复删除它留下空白行。然后对小文件中的所有其余数据重复该过程,直到我删除大文件中的所有重复项。
标签: python file search duplicates compare