【问题标题】:Generate 1 GB file containing 4 columns in Python在 Python 中生成包含 4 列的 1 GB 文件
【发布时间】:2019-01-21 23:34:14
【问题描述】:

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

第 1 列:Sno 第 2 列:应随机分配为数字 1-10 Column 3-Column4:应该是长度为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,类似于“反压缩”。

谢谢

【问题讨论】:

  • id_generator 是干什么用的?
  • 哎呀对不起,那是多余的。我会删除它。
  • 你为什么要制作一个巨大的文件?
  • 更有效的方法是不在 Python 中进行。 1. numpy虽然快,但桥接很慢,每次碰弦都要桥接。 2.numpy依靠批量做事,减少需要桥接的次数;所以检查你需要多少物品是行不通的。在 C 中这将是微不足道的(而且很快):生成每一行,将其长度添加到总和,打印出来,如果总和超过 1G,则中断循环。
  • @roganjosh:你说得对,我没注意。更糟糕的是——最后两列都是用 Python 编写的。最后两行构造了 50000000 个列表对象,每个大约 825000000 个 int 对象和 50000000 个字符串对象。那是 1850000000 个对象实例化。

标签: python pandas numpy memory size


【解决方案1】:

试试这个。我认为它的内存分配会更少,所以希望更快一点(我花了大约 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2013-12-28
    • 2011-06-12
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多