随机混合300万行文件

Nig*_*igu 26 python random vim

一切都在标题中.我想知道是否有人知道快速和合理的内存需求随机混合300万行文件的所有行的方式.我想用简单的vim命令是不可能的,所以任何使用Python的简单脚本都是如此.我使用随机数生成器尝试使用python,但没有设法找到一个简单的方法.

Joh*_*ica 42

在Python中只需几秒钟:

>>> import random
>>> lines = open('3mil.txt').readlines()
>>> random.shuffle(lines)
>>> open('3mil.txt', 'w').writelines(lines)
Run Code Online (Sandbox Code Playgroud)

  • 它当然*确实*有效,而且效果很好.它只能生成2**19937个排列,这是无关紧要的.任何基于RNG的shuffle都具有相同的"限制". (6认同)
  • @Chris你错误地解释了这个答案.无法生成所有可能的排列与根本无法随机重排列表不同.我讨厌如此争论,但你的警示是对你所链接的帖子的误解**,而且我的回答是错误的. (4认同)
  • @Chris:...你还没有解释为什么你认为使用同一个RNG,在同一时期内为每个元素分配一个随机密钥,然后按该密钥排序,将使所有其他的排列成为可能. .. (3认同)
  • 基于`sort()`的解决方案比`shuffle()更好吗?它不能避免这个假设的问题. (2认同)

S.L*_*ott 31

import random
with open('the_file','r') as source:
    data = [ (random.random(), line) for line in source ]
data.sort()
with open('another_file','w') as target:
    for _, line in data:
        target.write( line )
Run Code Online (Sandbox Code Playgroud)

应该这样做.除非线路是巨大的(超过512个字符),否则300万行将适合大多数机器的内存.

  • @ Vikram.exe:使用内存有什么问题?这就是我们购买它的原因. (18认同)
  • -1这个方法绝对没有优于`random.shuffle`的优势(实现为[Fisher-Yates shuffle])(http://programmers.stackexchange.com/questions/215737/how-python-random-shuffle-works/215780 #215780),它具有更好的运行时特性(`O(n)`而不是'O(N log(N)`).) (5认同)
  • @ Vikram.exe.并不是的.这台机器有4Gb的内存.240M什么都没有. (2认同)

Dra*_*ag0 19

我刚刚在一个有4.3M行的文件上尝试了这个,最快的是Linux上的'shuf'命令.像这样使用它:

shuf huge_file.txt -o shuffled_lines_huge_file.txt
Run Code Online (Sandbox Code Playgroud)

完成需要2-3秒.