我们试图从一个非常大的文件中获取大约1M的随机行,其中可能有大约3M的记录。需要将选定的随机行写入第三个文件。 你对我们有什么建议吗?
答案 0 :(得分:4)
供将来参考,因为其他答案已经提供了适用于内存的工作负载的解决方案:
import random
def reservoir_sampling(l, k):
it = iter(l)
try:
result = [next(it) for _ in range(k)] # use xrange if on python 2.x
except StopIteration:
raise ValueError("Sample larger than population")
for i, item in enumerate(it, start=k):
s = random.randint(0, i)
if s < k:
result[s] = item
random.shuffle(result)
return result
with open('input.txt') as infile, open('output.txt', 'a') as outfile:
for line in reservoir_sampling(infile, 1000000):
outfile.write(line)
该算法称为储层采样,需要O(n)
时间和O(k)
内存,具体取决于您的需求,您可能需要或可能不需要random.shuffle
调用。
答案 1 :(得分:3)
import random
with open('input.txt') as infile, open('output.txt', 'a') as outfile:
outfile.writelines(random.sample(infile.readlines(), 1000000))
这是更快速的方法之一,也很简单。所以,那就是看看它是否适合你的问题。
答案 2 :(得分:2)
您可以使用readlines()并将文件转储到列表中。然后你可以简单地生成100万个随机数。当然,它们必须在文件列表/行数的范围内,并且每次生成随机数时,访问列表中该位置的行并将其写入要移动它的文件in。