【问题标题】:Optimizing memory managemente for huge variables in Jython优化 Jython 中巨大变量的内存管理
【发布时间】:2014-08-01 11:55:56
【问题描述】:

我使用大约 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 提供给我的所有东西,所以理想的解决方案可能就在我面前,我看不到它......我希望精通它的人可以帮助开发人员

【问题讨论】:

    标签: python performance csv memory jython


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2014-08-15
      • 2017-06-16
      • 2011-02-17
      • 2015-10-26
      相关资源
      最近更新 更多