在 sql3 中随机播放大表
Posted
技术标签:
【中文标题】在 sql3 中随机播放大表【英文标题】:Shuffle huge table in sql3 【发布时间】:2019-09-30 12:50:24 【问题描述】:我目前正在使用 sqlite3 python 包来访问数据库中表中的数据。 该表非常大 - 大约 100GB - 我想随机化它的行,因为它包含我的 NN 的训练数据,它需要多次查看整个数据。
目前我正在使用游标遍历表,它会根据我的系统内存获取表的一部分。
我知道如何随机访问数据,但我不知道如何以某种方式做到这一点,即我只能在一个时期内访问一次表中的所有数据。因此,我正在寻找一种方法来随机化整个表,即使这在计算上可能非常昂贵。
有没有简单的方法或者你有更好的建议? 谢谢!
【问题讨论】:
可能只查询主键/rowid 列,打乱结果然后根据随机化的rowid/主键值分块查询表 【参考方案1】:这个答案不是特定于 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;
获取一些批次而不是整个表。
希望我已经回答了你的问题,祝你有美好的一天!
【讨论】:
非常感谢!两种选择都很棒! 如果这是您想要的,那就太好了,但只有一件事,两个答案都需要对表进行全面扫描,这可能会很长。您可能想调查一些更多依赖于 SQLite 的答案。 两者都有效,但正如您所难过的那样,这需要相当长的时间。但是,我使用第一种方法创建了一个新表,然后可以按顺序读取该表。一件值得注意的事情是,洗牌命令(不获取)需要大量磁盘空间,然后释放。我不知道为什么。无论如何,再次感谢您帮助我!以上是关于在 sql3 中随机播放大表的主要内容,如果未能解决你的问题,请参考以下文章