Создайте 1 ГБ файл, содержащий 4 столбца в Python - PullRequest
0 голосов
/ 22 января 2019

Я хочу создать файл в python со следующими характеристиками:

Столбец 1: Sno Столбец 2: Должен быть случайным образом назначен как числа 1-10 Столбец 3-Столбец4: Должен быть случайными символами длины 1-32

Я хочу, чтобы размер этого файла был больше 1 ГБ.В настоящее время я использую этот код:

import pandas as pd
import numpy as np
import random
import string
from random import choices
from string import ascii_lowercase

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(50000000,1)),
                    columns=['integer1'])

df['String1']= ["".join(choices(ascii_lowercase, k=random.randint(1,32))) for _ in range(50000000)]
df['String2']= ["".join(choices(ascii_lowercase, k=random.randint(1,32))) for _ in range(50000000)]

Но этот код очень медленный и занимает так много времени.Есть ли более эффективный способ сделать это?

Я также нахожу строку с наибольшим числом гласных, учитывая строковые столбцы.

Кроме того, есть ли способ не генерировать 50 миллионов(строки, как видно в коде), но все равно имеют размер до 1 ГБ, что-то вроде «Анти-сжатия».

Спасибо

1 Ответ

0 голосов
/ 22 января 2019

Попробуй это. Я думаю, что у него будет меньше памяти, так что, надеюсь, немного быстрее (у меня это заняло ~ 300 с). Вы можете сделать это быстрее, просто передавая данные прямо в файл, нет необходимости использовать Pandas, но я использовал это здесь, когда вы начали с него

import pandas as pd
import numpy as np
import random
import string
from random import choices
from string import ascii_lowercase

size = 50000000

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(size,1)),
                    columns=['integer1'])

df['String1']= pd.util.testing.rands_array(32, size)
df['String1'] = df['String1'].apply(lambda x: x[0:random.randint(0,32)])
df['String2']= pd.util.testing.rands_array(32, size)
df['String2'] = df['String2'].apply(lambda x: x[0:random.randint(0,32)])

df.head()

Либо просто перейдем прямо к файлу, который будет использовать меньше памяти:

f = open("demofile.txt", "w")

for i in range(0,30000000):
    f.write("{},{},{}\n".format(random.randint(0,10), ''.join(choices(ascii_lowercase, k=random.randint(1,32))), ''.join(choices(ascii_lowercase, k=random.randint(1,32)))))
    if i % 50000 == 0:
        f.flush()

f.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...