【问题标题】:Intersecting 2 big datasets相交 2 个大数据集
【发布时间】:2013-12-05 02:00:45
【问题描述】:

我有一个包含几列的巨型 (100Gb) csv 文件和一个包含几列的较小 (4Gb) csv。两个数据集中的第一列具有相同的类别。我想用大文件的记录创建第三个 csv,该文件恰好在小 csv 中具有匹配的第一列。在数据库方面,这将是第一列的简单连接。

我正在努力寻找提高效率的最佳方法。由于较小的数据集适合内存,我正在考虑将其加载到一种集合结构中,然后逐行读取大文件并查询内存中的集合,然后写入文件。

只是用 SO 术语来表达问题,是否有最佳方法来实现这一点?

编辑:这是一次性操作。

注意:语言不相关,欢迎对列、面向行的数据库、python 等提出建议...

【问题讨论】:

  • 请对不赞成票发表评论,以便我改进问题。
  • 您多久执行一次连接?如果不止一次,将这两个文件读入数据库。
  • 我没有经验,但您可能希望查看 HDF5 以获取如此大的数据。
  • 100GB 不是那么大。 TB 级数据库很常见
  • 对于 1 次操作,我认为您的方法很好......它可能是一个 15-20 行的 python 程序。

标签: c# python database bigdata


【解决方案1】:

类似

import csv

def main():
    with open('smallfile.csv', 'rb') as inf:
        in_csv = csv.reader(inf)
        categories = set(row[0] for row in in_csv)

    with open('bigfile.csv', 'rb') as inf, open('newfile.csv', 'wb') as outf:
        in_csv  = csv.reader(inf)
        out_csv = csv.writer(outf)
        out_csv.writerows(row for row in in_csv if row[0] in categories)

if __name__=="__main__":
    main()

我想您的意思是 100 GB,而不是 100 GB;大多数现代硬盘驱动器的最高速度约为 100 MB/s,因此预计从磁盘读取数据大约需要 16 分钟。

【讨论】:

  • 谢谢!这可以以某种方式优化以按块读取/比较/写入吗?
【解决方案2】:

如果您只这样做一次,那么您的方法就足够了。我要做的唯一改进是分块而不是逐行读取大文件。这样您就不必过多地访问文件系统。您希望块尽可能大,同时仍适合内存。

如果您需要多次执行此操作,请考虑将数据推送到某个数据库中。您可以插入大文件中的所有数据,然后使用第二个较小的文件“更新”该数据,以获得一个完整的数据库,其中包含一个包含所有数据的大表。如果您使用像 Cassandra 这样的 NoSQL 数据库,这应该是相当高效的,因为 Cassandra 非常好并且可以有效地处理写入。

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多