Jython中大变量的优化内存管理

2024-10-01 15:30:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用一个大约7到10 MB的CSV文件作为输入,大约65.000行,其中包含几个关于公司主机的数据字段:对于每个主机,它的AssetID、FQDN和六个属性字段(参见下面的示例)

LServer_0107587|dcsrvivw.gepre.corp|SvcC_0002001|PREPRODUCTION|SvcT_0001086|PREPRODUCTION|SvcB_0000160|INFRASTRUCTURE MANAGEMENT
LServer_0053150|WASCTCEIV-ADM.GADPRE.CORP|SvcC_0002001|PREPRODUCTION|SvcT_0001086|PREPRODUCTION|SvcB_0000160|INFRASTRUCTURE MANAGEMENT

使用csv.reader对象迭代每一行并将其内容保存到RAM:

for prop, column in PROP_COLUMNS:
    prop_value = row[column]
    data[(FQDN, prop)].add(prop_value)

然后,当输入文件被完全复制后,就可以使用不同的语法将其转储到输出文件中:

FQDN, property_name, property_values

对于较小的CSV文件,这是完美的。不过,这个巨大的CSV似乎有时会阻塞JVM分配的内存,这取决于运行它的主机的当前使用情况。我认为是data.add位造成的。你知道吗

请注意,输入文件不一定按FQDNs排序,因此我不能像找到第二个具有相同FQDN的条目时那样逐行将输入复制到输出,因为它们应该合并。你知道吗

我在考虑将这个var映射到一个临时文件,并将其用作我已经在使用的var,但我甚至不确定这是否可行和/或易于实现。恐怕现在还不能使用数据库

我还不熟悉Python提供给我的所有东西,所以理想的解决方案可能就在我面前,我看不到它。。。我希望有人精通它可以帮助其他开发人员


Tags: 文件csvadddatavaluecolumnmanagementinfrastructure
1条回答
网友
1楼 · 发布于 2024-10-01 15:30:38

如果不能在内存中存储完整的数据集,可以考虑将磁盘用作(临时)存储。例如,每个FQDN都可以保存到一个文件中。你知道吗

类似于(这是半个伪代码!)地址:

temp_dir = tempfile.mktmpdir()
for row in csv:
    # Get FQDN and properties here
    fqdn_filepath = os.path.join(temp_dir, FQDN.name)
    if not os.path.exists(fqdn_filepath):
        # Create it from scratch
    else:
        # Add the new properties to the existing FQDN file

# Now you have finished iterating the CSV, you have a bunch of FQDN files
# Now process them one by one
with open_output_file() as output:
    for fqdn_file in sorted(os.path.files_in_dir(temp_dir)):
        output.write_fqdn_data()

delete temp_dir

相关问题 更多 >

    热门问题