Форум сайта python.su
Здравствуйте.
Помогите нужна программа генератор из текстового файла txt очень большого объёма (примерно 40 гиг)
Задача:
1. взять из файла 2 рандомных слова и совместить их без пробелов ( например взяты слова Коля Маша, на выходе КоляМаша)
2.Возможность повтора этих действий но уже с другими словами (так же рандомно), например указать параметр -N 100000 и тогда будет повтор действий 100000 раз.
3.Возможность добавить самому любое слово которое будет неизменно для всего цикла повторов.
У меня есть для Python 2, но она не может прочитать такой огромный файл.
Вот пример моей программы
import sys
import getopt
import random
#sys.stdout = open('test1.txt','wt')
help_message = '''
Command Exntensions:
-n <x> or --number <x>: Number of sample code phrases given. (Default is 5)
-w <file> or --wordlist <file>: Uses another wordlist to generate code phrases from.
'''
CODEWORDS = open('02.txt', 'r').readlines()
class Usage(Exception):
def __init__(self, msg):
self.msg = msg
def generate(prefix=False, number=5):
while number > 0:
if prefix == 'TRUE':
print ("Not Supported.")
# word1 = PREFIXES[int(random.uniform(0,len(PREFIXES)))]
elif prefix:
word1 = prefix
else:
word1 = CODEWORDS[int(random.uniform(0,len(CODEWORDS)))]
word2 = CODEWORDS[int(random.uniform(0,len(CODEWORDS)))]
print "Моё словоs%s%" % (word1.rstrip(), word2.rstrip())
number -= 1
def main(argv=None):
number = 5
prefix = False
if argv is None:
argv = sys.argv
try:
try:
opts, args = getopt.getopt(argv[1:], "hn:p:i:vw:", ["help", "number=", "prefix=", "wordlist="])
except getopt.error, msg:
raise Usage(msg)
# option processing
for option, value in opts:
if option == "-v":
verbose = True
if option in ("-h", "--help"):
raise Usage(help_message)
if option in ("-n", "--number"):
number = int(value)
if option in ("-w", "--wordlist"):
global CODEWORDS
print "Importing: %s" % value
CODEWORDS = open(value, 'r').readlines()
if option in ("-p", "--prefixe"):
print value
if (value):
prefix = value
else:
prefix = 'TRUE'
generate(prefix, number)
except Usage, err:
print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg)
print >> sys.stderr, "\t for help use --help"
return 2
if __name__ == "__main__":
sys.exit(main())
Офлайн
djjecДа её идиот какой-то писал. Использует в одной программе глобальную переменную с подменой её значения где-то в глубине кода и классы для вывода исключений. А проверка значения на строку TRUE - вовсе шедевр.
У меня есть для Python 2, но она не может прочитать такой огромный файл.
djjecКак она прочитает сорок гигабайт в оперативную память, если у тебя оперативной памяти в компьютере восемь/шестнадцать гигабайт всего?
У меня есть для Python 2, но она не может прочитать такой огромный файл.
djjecПридётся тебе разбить этот файл на несколько файлов. Возможно даже, на несколько тысяч файлов. Потом сначала выбирать рандомно файлы, а потом из них выбирать рандомно слова. Тогда оно будет работать за приемлемое время, так как вся скорость ляжет на операционную систему, которая с диском работает и файлы на нём ищет максимально быстро.
Помогите нужна программа генератор из текстового файла txt очень большого объёма (примерно 40 гиг)
Отредактировано py.user.next (Ноя. 12, 2022 23:16:38)
Офлайн
Так поэтому и прошу тут помощи!
Подскажите где можно взять такой шаблон с теми требованиями что мне нужно?
Этому коду что я скинул много лет! Я не могу нигде найти готовое решение!
У меня Linux и 128Gb оперативки, и к сожалению даже с таким обемом этоа программа не может прочитать файл с 20 гиг.
Всё облазил, уже не знаю к кому и обратится за помощью!
Максимум что нашёл, это что он не читает весь файл и не закидывает в оперативку всё. НО он рандомит только с первых 1000 строк! А нужно чтобы со всех
Офлайн
а каким образом у вас получился такой большщй файл
1 байт это один символ предположим одно слово это 10 символов
40000000 символов это сколько слов
Отредактировано AD0DE412 (Ноя. 13, 2022 21:32:19)
Офлайн
Тебе правильно подсказали
Не нужно пытаться проглотить камаз целиком.
Твоя задача получить рандомные слова. Таким образом тебе нужно прежде всего отщипнуть от большого файла
по одной строке, мегабайту, длине - его кучоски в рандомных областях, после чего из полученных мелких кусочков вытянуть по слову и склеить их
посмотри в сторону chunks
https://www.bluebirz.net/en/make-it-chunks/ - это не решение твоей проблемы но наведет на мысли. Я гдето видел примеры можно просто указывать в мегабайтах кучски например содерэимое с 123 по 124 метр.
Итд. В любом случае открывать 40 гиг в память ради двух слов - ето какойто тупизм.
Если реально нужно очень много таких операций то наверное будет правильнее уже разово загнать весь этот файл в какую нить базу данных и стрелять из нее запросами
Какую именно базу выбрать нужно решать по структуре запроса и хранения данных
Офлайн
AD0DE412ЛОг файл, база адинезы, да много еще где
а каким образом у вас получился такой большщй файл1 байт это один символ предположим одно слово это 10 символов40000000 символов это сколько слов
Офлайн
djjecпроверь как долго будет считать количество строк в большом файле
взять из файла 2 рандомных слова
def get_num_line_from_file(file): with open(file, 'r') as f: cout = 0 while True: if f.readline(): cout += 1 else: break return cout print(get_num_line_from_file('1.txt'))
Офлайн
AD0DE412У меня слово из 8 символов, число строк 4294967296 это 16 в 8 степени
а каким образом у вас получился такой большщй файл
1 байт это один символ предположим одно слово это 10 символов
40000000 символов это сколько слов
Офлайн
xam1816SyntaxError: invalid syntax
проверь как долго будет считать количество строк в большом файле
Офлайн
djjecизвестно число строк, так выбрать случайную строку из них
число строк 4294967296
line_num = random.randrange(0, 4294967296)
Офлайн