Найти - Пользователи
Полная версия: Генератор слов из файла большого размера
Начало » Python для новичков » Генератор слов из файла большого размера
1 2 3 4 5
djjec
Здравствуйте.
Помогите нужна программа генератор из текстового файла 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())
py.user.next
djjec
У меня есть для Python 2, но она не может прочитать такой огромный файл.
Да её идиот какой-то писал. Использует в одной программе глобальную переменную с подменой её значения где-то в глубине кода и классы для вывода исключений. А проверка значения на строку TRUE - вовсе шедевр.

djjec
У меня есть для Python 2, но она не может прочитать такой огромный файл.
Как она прочитает сорок гигабайт в оперативную память, если у тебя оперативной памяти в компьютере восемь/шестнадцать гигабайт всего?
Этот дебилоид читает всё содержимое файла в оперативную память, хотя можно прекрасно без этого обойтись. Он даже не знает, как правильно строки из файла прочитать все; использует устаревший метод, который устарел там лет двадцать назад примерно. То же самое касается и getopt; уже давно argparse используется везде и про древний getopt можно уже забыть навсегда.

djjec
Помогите нужна программа генератор из текстового файла txt очень большого объёма (примерно 40 гиг)
Придётся тебе разбить этот файл на несколько файлов. Возможно даже, на несколько тысяч файлов. Потом сначала выбирать рандомно файлы, а потом из них выбирать рандомно слова. Тогда оно будет работать за приемлемое время, так как вся скорость ляжет на операционную систему, которая с диском работает и файлы на нём ищет максимально быстро.
djjec
Так поэтому и прошу тут помощи!
Подскажите где можно взять такой шаблон с теми требованиями что мне нужно?
Этому коду что я скинул много лет! Я не могу нигде найти готовое решение!
У меня Linux и 128Gb оперативки, и к сожалению даже с таким обемом этоа программа не может прочитать файл с 20 гиг.
Всё облазил, уже не знаю к кому и обратится за помощью!
Максимум что нашёл, это что он не читает весь файл и не закидывает в оперативку всё. НО он рандомит только с первых 1000 строк! А нужно чтобы со всех
AD0DE412
а каким образом у вас получился такой большщй файл
1 байт это один символ предположим одно слово это 10 символов

40000000 символов это сколько слов

ZerG
Тебе правильно подсказали
Не нужно пытаться проглотить камаз целиком.
Твоя задача получить рандомные слова. Таким образом тебе нужно прежде всего отщипнуть от большого файла
по одной строке, мегабайту, длине - его кучоски в рандомных областях, после чего из полученных мелких кусочков вытянуть по слову и склеить их
посмотри в сторону chunks
https://www.bluebirz.net/en/make-it-chunks/ - это не решение твоей проблемы но наведет на мысли. Я гдето видел примеры можно просто указывать в мегабайтах кучски например содерэимое с 123 по 124 метр.
Итд. В любом случае открывать 40 гиг в память ради двух слов - ето какойто тупизм.
Если реально нужно очень много таких операций то наверное будет правильнее уже разово загнать весь этот файл в какую нить базу данных и стрелять из нее запросами
Какую именно базу выбрать нужно решать по структуре запроса и хранения данных
ZerG
AD0DE412
а каким образом у вас получился такой большщй файл1 байт это один символ предположим одно слово это 10 символов40000000 символов это сколько слов
ЛОг файл, база адинезы, да много еще где
В наше время 40 гигами уже никого и не удивишь.
Я бы смотрел в сторону как решать данный вопрос со стороны самого файла (в базу кидать) чем на питоне костылить.
Но видимо там какието мамонты а программистов нет которые крутили это все
xam1816
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'))
djjec
AD0DE412
а каким образом у вас получился такой большщй файл
1 байт это один символ предположим одно слово это 10 символов

40000000 символов это сколько слов
У меня слово из 8 символов, число строк 4294967296 это 16 в 8 степени
djjec
xam1816
проверь как долго будет считать количество строк в большом файле
SyntaxError: invalid syntax
xam1816
djjec
число строк 4294967296
известно число строк, так выбрать случайную строку из них
  
line_num = random.randrange(0, 4294967296)
и уже в ней взять два случайных слова
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB