在sql3中洗牌巨大的表格



我目前正在使用 sqlite3 python 包来访问数据库中表中的数据。 该表非常大 - 大约 100GB - 我想随机化它的行,因为它包含我的 NN 的训练数据,需要多次查看整个数据。

目前,我正在使用光标遍历表,游标根据我的系统内存获取表的一部分。

我知道如何随机访问数据,但我不知道如何以某种方式做到这一点,即我在一个纪元中只能访问一次表中的所有数据。因此,我正在寻找一种随机化整个表的方法,即使这可能在计算上非常昂贵。

有没有简单的方法可以做到这一点,或者你有更好的建议吗? 感谢!

这个答案不是SQLite特定的,因为我没有经常使用它,而是在SQL中更多地使用它。

有两件事,要么你关心可重复的结果,要么不关心。 如果没有,可以执行以下操作:

SELECT *
FROM my_table
ORDER BY random();

否则,当我想要使用 SQL 进行可重现的洗牌时,我通常会对值的串联进行哈希处理,比如说"1001"和行中的一些值。

SELECT MD5('1001' || my_column_1 || my_column_2) as r, my_column_1, my_column_2
FROM my_table
ORDER BY r;

当然,只有当列中的值发生变化时,这才有好处。

您可以应用如下限制

SELECT MD5('1001' || my_key_1 || my_key_2) as r, my_key_1, my_key_2
FROM my_table
ORDER BY r
LIMIT 10000;

获取一些批次而不是整个表。

希望我已经回答了你的问题,祝你有美好的一天!

最新更新