在 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 中随机播放大表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode11 中的 Swift 中随机播放数组中的音频文件?

在 Swift 3 中从数组中播放随机声音

调用时不播放随机音频列表

防止在随机播放模式下重复播放

如何在 HTML 中播放多首随机歌曲

如何在 django views.py 中随机播放列表?