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

时间:2014-08-01 11:55:57

标签: python performance csv memory jython

我使用大约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位负责它。

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

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

我还不熟悉Python为我提供的所有内容,所以理想的解决方案也可能就在我面前,我无法看到它......我希望有精通它的人可以帮助开发人员

1 个答案:

答案 0 :(得分:0)

如果无法将完整数据集存储在内存中,则可以将磁盘用作(临时)存储。例如。每个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