Вопрос интересный и если еще актуален.
Был вариант каждый раз смешивать исходный массив данных (
текстовый файл с большим количеством строк) и брать случайное количество в заданном промежутке в файл names.txt.
В итоге скрипт просит указать БОЛЬШОЙ файл, файл ИМЕН и ПРОМЕЖУТОК. Создаются папки из файла ИМЕН во временной директории "out_log", в каждый файл случайным образом, без повторов, вносятся строчки из БОЛЬШОГО файла.
Тестировал на машине под Fedora 20 Workstation
CPU Intel(R) Core(TM) i7-3770S CPU @ 3.10GHz
RAM Kingstone KHX1600C10D3/8GX 16Gb Speed: 1333 MHz
OSHDD Intel SSD 520
На обработку списка из Всех городов России и 120,000,000 исходных строках в промежутку 1000-1200 ушло 0.50с
#! /usr/bin/env python
# File: rndappend.py
#
# Created: Sat 20 Dec 2014 16:05:30
# Last Modified: Mon 29 Dec 2014 01:21:58
# Maintainer: sharlatan, <sharlatanus@gmail.com>
# License: Same as Python (GPL)
# Credits: www.toster.ru/q/166037
#
"""
-=[ Description
The idea of this script (Scr) is taken from www.toster.ru. We give to the Scr
file of names.txt (more then 1kk lines, file of cities.txt (up to 100) and
numbert in some range.
Create files from cities.txt and copy random <lines> from <source> to them.
"""
import os
import sys
from random import randint
LOC_PATH = "out_log"
if not os.path.exists(LOC_PATH):
os.makedirs(LOC_PATH)
def mk_f(dir_name, stuff):
# Create <dir_name> in <LOC_PATH> with <names.txt> fild with <stuff>
path_to_bask = os.getcwd()
new_path = os.path.join(LOC_PATH, dir_name)
os.makedirs(new_path)
os.chdir(new_path)
with open('names.txt', 'w') as f:
for c in stuff:
f.write("%s\n" % c)
f.close()
os.chdir(path_to_bask)
def read_f(file_in):
# Read file and retun list of lines without empty items
with open(file_in, 'r') as f:
file_out = f.read().split('\n')
return file_out[:-1]
def rnd_chunk(into_list, min_piece, max_piece):
# Return random lines from <into_list> withing given range
out_list = []
item_quantity = randint(min_piece, max_piece)
into_list_len = len(into_list)
while True:
if len(out_list) != item_quantity:
put_in = into_list[randint(0,into_list_len-1)]
if put_in not in out_list:
out_list.append(put_in)
else:
return out_list
def usage():
# Show the usage of the script
file_name = sys.argv[0]
print ("""\nIncorrect quantity of arguments given or unexisting files
Usage: %s <source file> <cities file> <lines MIN-MAX>\n""" % file_name)
def main():
"""
Check arguments, for quantity given, for existence of files, for given
length of <lines>
"""
if len(sys.argv) != 4:
usage()
quit()
elif os.path.isfile(sys.argv[1]) != True \
or os.path.isfile(sys.argv[2]) != True:
usage()
quit()
# Take all varialbe from argv
GET_PIEACE = sys.argv[3].split("-")
PIECE_MIN = int(GET_PIEACE[0])
PIECE_MAX = int(GET_PIEACE[1])
CITIES = read_f(sys.argv[2])
SOURCE = read_f(sys.argv[1])
for city_name in CITIES:
mk_f(city_name, rnd_chunk(SOURCE, PIECE_MIN, PIECE_MAX))
if __name__ == '__main__':
main()