큰 입력/계층 구조에 대한 문제가 될 수 있습니다 당신은 메모리에 모든 입력을로드됩니다 주어진 솔루션, 대부분의 문제. Tom Christiansen과 Nat Torkington이 적용한 The Perl Cookbook의 솔루션이 있습니다. 디렉토리 아래에 어디서나 임의의 파일을 얻으려면 :
#! /usr/bin/env python
import os, random
n=0
random.seed();
for root, dirs, files in os.walk('/tmp/foo'):
for name in files:
n=n+1
if random.uniform(0, n) < 1: rfile=os.path.join(root, name)
print rfile
조금 일반화하는 편리한 스크립트를 만든다 : 나는 내 질문에 입력을 완료하기 전에
$ cat /tmp/randy.py
#! /usr/bin/env python
import sys, random
random.seed()
n=1
for line in sys.stdin:
if random.uniform(0, n)<1: rline=line
n=n+1
sys.stdout.write(rline)
$ /tmp/randy.py < /usr/share/dict/words
chrysochlore
$ find /tmp/foo -type f | /tmp/randy.py
/tmp/foo/bar
죄송합니다 사람을 실수로 제출했다. 많이 바뀌면 안된다. – JasonSmith
경쟁 조건 문제를 명확하게 설명해 주시겠습니까? 나는 당신이 누군가를 선택하고 열려고 시도하는 것 사이에 그것을 삭제할 수있을 때 (예를 들어 누군가) 그것을 개입하는 창없이 파일을 선택하고 여는 것을 의미한다고 생각하고있다. 그러나이 명시 적으로 진술 할 가치가있다. (나는 당신을 올바르게 해석한다고 가정한다.). – Brian
여러 프로세스가 동시에이 작업을 수행하기 때문에 경쟁 조건이 있습니까? 또는 파일을 만드는 작성자와이를 선택하는이 판독기가 있기 때문에 경쟁 조건이 발생합니까? –