我在postgres中有一个包含数百万行的表.我在网上查了一下,发现了以下内容
SELECT myid FROM mytable ORDER BY RANDOM() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
它工作,但它真的很慢......是否有另一种方式来进行查询,或者直接选择随机行而不读取所有表格?顺便说一下'myid'是一个整数,但它可以是一个空字段.
谢谢
在MySQL中我可以使用RAND()函数,在SQLite 3中有没有其他选择?
这与之前的问题类似,但那里的答案不能满足我的需求,我的问题略有不同:
我目前对一些包含排序数据的非常大的文件使用gzip压缩.当文件未被压缩时,二进制搜索是支持在排序数据中寻找位置的便捷有效方式.
但是当文件被压缩时,事情变得棘手.我最近发现了zlib的Z_FULL_FLUSH选项,可以在压缩过程中使用它在压缩输出中插入"同步点"(inflateSync()然后可以从文件中的各个点开始读取).这是可以的,虽然我已经拥有的文件必须重新压缩才能添加此功能(奇怪的gzip是没有这个选项,但如果必须,我愿意编写自己的压缩程序).
从一个来源看来,即使Z_FULL_FLUSH不是一个完美的解决方案......不仅所有gzip档案都不支持它,而且在档案中检测同步点的想法可能会产生误报(或者与同步的幻数重合)点,或由于Z_SYNC_FLUSH也产生同步点但它们不能用于随机访问的事实.
有更好的解决方案吗?如果可能的话,我想避免使用辅助文件进行索引,并且对准随机访问的显式默认支持将是有帮助的(即使它是大粒度的 - 就像能够以每10 MB的间隔开始读取一样).是否有另一种压缩格式比gzip更好地支持随机读取?
编辑:正如我所提到的,我希望在压缩数据中进行二进制搜索.我不需要寻找特定的(未压缩的)位置 - 只是在压缩文件中寻找一些粗粒度.我只是希望能够支持诸如"将数据从大约50%(25%,12.5%等)开始压缩到此压缩文件中".
我已经读过按位置索引访问元素可以在STL双端队列中以恒定时间完成.据我所知,双端队列中的元素可能存储在几个非连续的位置,从而消除了通过指针算法的安全访问.例如:
ABC-> defghi-> jkl-> MNOP
上面的双端队列元素由一个字符组成.一组中的字符集表示它被分配在连续的存储器中(例如,abc在单个存储器块中,defhi位于另一个存储器块中,等等).任何人都可以解释如何通过位置索引进行访问可以在恒定时间内完成,特别是如果要访问的元素在第二个块中?或者双端队列是否有指向这组块的指针?
更新:或者deque还有其他常见的实现吗?
什么是允许在文件中随机读/写的最佳压缩算法?
我知道任何自适应压缩算法都是不可能的.
我知道霍夫曼编码是不可能的.
有没有人有更好的压缩算法,允许随机读/写?
我认为你可以使用任何压缩算法,如果你用块写它,但理想情况下我不想一次解压缩整个块.但是,如果您有关于简单方法的建议以及如何知道块边界,请告诉我.如果这是您的解决方案的一部分,请告诉我您想要读取的数据是否跨越块边界时要执行的操作?
在您的答案的上下文中,请假设有问题的文件是100GB,有时我想读取前10个字节,有时我想读取最后19个字节,有时我想阅读17中间的字节..
为什么我的代码不起作用?
package generatingInitialPopulation;
import java.util.Arrays;
import java.util.Collections;
public class TestShuffle {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
其结果是:0 1 2 3 4 5 6 7 8 9.
我期待一个随机改组的序列.
我有一个文本文件,其中包含几个"记录".每条记录都包含一个名称和一组数字作为数据.
我正在尝试构建一个将读取文件的类,仅显示所有记录的名称,然后允许用户选择他/她想要的记录数据.
我第一次浏览文件时,我只读取标题名称,但我可以跟踪标题所在文件中的"位置".我需要随机访问文本文件,以便在用户请求后查找每条记录的开头.
我必须这样做,因为文件太大,无法完全在内存(1GB +)中读取应用程序的其他内存需求.
我已经尝试使用.NET StreamReader类来实现这一点(它提供了非常容易使用的'ReadLine'功能,但是没有办法捕获文件的真实位置(BaseStream属性中的位置因为缓冲类使用).
在.NET中没有简单的方法吗?
或者换句话说,为什么访问数组中的任意元素需要花费不变的时间(而不是O(n)或其他时间)?
我搜索了一下我的心脏寻找答案,并没有找到一个非常好的答案,所以我希望你们中的一个人可以与我分享你们的低级知识.
只是为了让你知道我希望得到的答案有多低,我会告诉你为什么我认为它需要不断的时间.
当我array[4] = 12在程序中说,我实际上只是将存储器地址的位表示存储到寄存器中.硬件中的该物理寄存器将根据馈送它的位表示打开相应的电信号.那些电子信号将以某种方式神奇地(希望有人可以解释魔法)在物理/主存储器中访问正确的存储器地址.
我知道这很粗糙,但它只是让你知道我正在寻找什么样的答案.
(编者注:从OP后来的评论中,他了解地址计算需要花费一些时间,并且只是想知道之后会发生什么.)
RandomAccessFile对于随机访问文件非常慢.您经常阅读有关在其上实现缓冲层的信息,但是无法在线查找代码.
所以我的问题是:你们谁知道这个类的任何开源实现共享指针或共享你自己的实现?
如果这个问题会成为关于这个问题的有用链接和代码的集合,我很确定,很多人都会共享这个问题并且SUN从来没有正确解决这个问题.
请不要引用MemoryMapping,因为文件可能比Integer.MAX_VALUE大.
我正在研究一个多线程程序,其中所有线程共享一些向量(只读).每个线程的目标是遍历整个向量.尽管如此,所有线程都必须以不同的方式访问此向量.
由于向量是const并且在所有线程之间共享,我不能使用random_shuffle并且只是迭代它.现在我的解决方案是构建一个crossref向量,它将在共享向量上包含索引,然后对该向量进行混洗,即
std::vector<int> crossref(SIZE) ; // SIZE is the size of the shared vector
std::iota (std::begin(crossref), std::end(crossref), 0); // Fill with indices ref
std::mt19937 g(SEED); // each thread has it own seed.
std::shuffle (crossref_.begin(), crossref_.end(), g); // Shuffle it
Run Code Online (Sandbox Code Playgroud)
尽管如此,这样做会揭示一些问题(1)它不是非常有效,因为每个线程在访问共享向量之前需要访问它的crossref向量,(2)由于所需的内存量,我有一些性能问题:共享向量是非常大,我有很多线程和处理器.
有没有人有一些改进的想法,将避免额外的内存需求?