1

我试图通过迭代数千条数据库记录来生成一个大数据文件(以 GB 为单位)。文件的顶部是文件后面出现的每个“功能”的一行。他们看着像是:

@attribute 'Diameter' numeric
@attribute 'Length' real
@attribute 'Qty' integer

包含使用这些属性的数据的行如下所示:

{0 0.86, 1 0.98, 2 7}

但是,由于我的数据是稀疏数据,所以我的数据库中的每条记录可能都没有每个属性,并且我事先不知道完整的特征集是什么。理论上,我可以迭代我的数据库记录两次,第一次是累积功能集,然后第二次输出我的记录,但我正在尝试找到一种更有效的方法。

我想尝试类似以下伪代码的方法:

fout = open('output.dat', 'w')
known_features = set()
for records in records:
    if record has unknown features:
        jump to top of file
        delete existing "@attribute" lines and write new lines
        jump to bottom of file
    fout.write(record)

这是跳转/写入/跳转部分,我不知道如何完成。你会如何在 Python 中做到这一点?

我试过类似的东西:

fout.seek(0)
for new_attribute in new_attributes:
    fout.write(attribute)
fout.seek(0, 2)

但这会覆盖文件顶部的属性行和数据行,而不是简单地从我指定的查找位置开始插入新行。

在不将整个文档加载到内存中的情况下,如何在 Python 中获得文字处理器的“插入”功能?最终文件大于我所有可用内存。

4

2 回答 2

1

为什么不获取所有功能及其数据类型的列表?首先列出它们。如果缺少某个功能,请将其替换为已知值 -NULL似乎合适。

这样,您的记录将是完整的(在长度上),并且您不必在文件中跳来跳去。

另一种方法是,写两个文件。一个包含您的所有功能,另一个包含您的所有行。生成这两个文件后,将功能文件附加到数据文件的顶部。

FWIW,文字处理器将文件加载到内存中进行编辑;然后他们写出整个文件。这就是为什么您不能加载大于文字处理器中可寻址/可用内存的文件的原因;或任何其他未实现为流阅读器的程序。

于 2012-11-08T04:37:55.973 回答
0

为什么不首先在内存中构建输出(例如作为字典)并在所有数据已知后将其写入文件?

于 2012-11-08T04:30:55.477 回答