我需要从网页解析大约5.000.000条记录(用户数据)。我编写了一个python函数,我将每个记录都作为字典。示例输出:
{'key1': 'value1', 'key2': ['value2'], 'key3:': ['value3a', 'value3b'], 'key4': value4}
它的字典当然是无序的,但更糟糕的是 - 键不是固定的。我也可以得到这样的输出:
{'key2': ['value2'], 'key3:': ['value3a', 'value3b', 'value3c', 'value3d'], 'key4': value4}
或
{'key3:': ['value3a'], 'key4': value4}
或事件只是一个空字典{}
。所以它可能是一个具有普通键值对的字典,键值是列表或只是空字典。字典,元组等没有字典
现在,我想将每条记录存储在数据库中。一个问题是获取整个数据大约需要30天,所以我使用5个线程(现在只有#6; 6天)),它运行我的get_data解析函数:
threading.Thread(target=get_data, args=(userId1, userId120)).start()
threading.Thread(target=get_data, args=(userId120, userId125)).start()
threading.Thread(target=get_data, args=(userId100, userId150)).start()
threading.Thread(target=get_data, args=(userId150, userId200)).start()
threading.Thread(target=get_data, args=(userId200, userId250)).start()
之前我没有使用任何数据库,因此我不想等待6天,并以错误的方式完成整个过程。作为输出,我想得到一个数据库,如:
key1 | key2 | key3
------------------------------------
value1 | value2 | (value3a,value3b)
NULL | value2 | (value3a,..,..,..)
NULL | NULL | NULL
其中(value3a,value3b)
存储在一个单元格中,但可以直接访问该列表中的任何值。
所以我的问题是:我应该使用什么数据库来存储数据以及如何处理多线程,而不是固定数量的键和一个单元格中的一些值?
答案 0 :(得分:0)
我建议使用multiprocessing.Pool
- 它很容易启动N个工作人员并提交一长串工作供他们运行。 threading
库很有趣但是较低级别且难以使用。
任何经典的SQL或NoSQL数据库都能够满足您的要求。 Sqlite3是最简单的,但它主要通过单个线程使用,所以我不推荐这个应用程序。 MySQL或Postgres或MongoDB都没关系。由于您不处理资金,后者可能最简单,因为它非常快速,灵活且易于入手。
玩得开心!
答案 1 :(得分:0)
PostgreSQL的最新版本有一些" No-SQL"可以通过各种方式处理列表值列的功能:作为键/值存储,作为JSON数据,作为数组。它也可以在值内索引。这些功能仅在DBMS的最新版本中有所改进(9.2有些,在当前的9.3中更多,在即将到来的9.4中更多)。
通常(99%的postgres用户,以及任何其他关系型dbms),您不以这种方式存储数据。相反,您规范化数据(UNfactor列表),以便每一行中每行最多只有一个值。在关系模型中,聚合这些值是查询的工作,例如,在SQL中使用GROUP BY子句。