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