在Python中生成包含4列的1 GB文件

时间:2019-01-21 23:34:14

标签: python pandas numpy memory size

我想在python中生成具有以下规范的文件:

第1列:Sno 第2栏:应随机分配为数字1-10 第3栏第4栏:应为长度为1-32的随机字符

我希望此文件的大小超过1 GB。我目前正在使用此代码:

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)]

但是这段代码确实很慢,并且花费很多时间。有更有效的方法吗?

考虑到字符串列,我还发现元音数量最多的行。

此外,还有一种方法可以不生成5000万行(如代码中所示),但仍可以使大小达到1 GB,类似于“抗压缩”。

谢谢

1 个答案:

答案 0 :(得分:1)

尝试一下。我认为它将分配的内存更少,因此希望更快一些(对我来说大约300s)。您可以通过直接将数据直接流到文件中来更快地执行此操作,而无需真正使用Pandas,但是在您开始使用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()