案例是我在内存中加载了大量二进制数据,需要在N字节长度的数据块和来自这个大集合中间的N字节块之间执行按位操作。
我的第一个想法是以某种方式获得指向N个字符的指针,然后将其更改为指向块的开始。我打算做的伪代码:
#include <iostream>
int main()
{
unsigned int n = getBlockLength(), x = getChunkStartPos(), s = getBinarySetLength();
char *binary_set;
char (*chunk_ptr)[n]; //Let's suppose n = 5
//char block[n] = {'s', 'm', 't', 'h', 'g'};
binary_set = malloc(s);
fillBinarySet(binary_set, s); //Let's suppose s = 15 and binary_set is now filled with {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'}
chunk_ptr = &binary_set + x;
std::cout << *chunk_ptr << std::endl; //should print "efghi"
//actually would do something like this:
//result = block & *chunk_ptr;
return 0;
}
这当然不会编译,字符数组只是一个例子,因为我已经说过它实际上是一组很大的二进制数据。即使它会编译,我也不确定系统如何知道chuck_ptr
指向n
个字节(它搜索空字符 - 我不能只放入binary_set
这个目的 - 在处理char
时,但在bool
s数组的情况下是什么?)...
“大”是指125MB到1000MB之间的东西。它很可能只是从文件中映射(mmap()
)而不是完全加载到内存中,但RAM消耗预计几乎相同,因为整个集合将经常进行读写操作。推荐的block
(和chunk)通常应该在1B和5MB之间。
对于实现这一目标的最快,最少CPU和RAM密集方式的想法,请?这是已经很繁重的应用程序的核心,也是唯一可行的解决方案(例如:从块的开始到结束逐字节循环二进制数据集)我可以开发的不适合性能要求。 :(
我只是想要一些想法或方向,而不是要求你为我做我的工作。如果使用C或C ++是不可能的,我想在其他高性能,编译的语言中指出一些解决方案。非常感谢。