我正在尝试将大量数据写入我的SSD(固态硬盘).大量的我的意思是80GB.
我浏览网页寻求解决方案,但我想出的最好的是:
#include <fstream>
const unsigned long long size = 64ULL*1024ULL*1024ULL;
unsigned long long a[size];
int main()
{
std::fstream myfile;
myfile = std::fstream("file.binary", std::ios::out | std::ios::binary);
//Here would be some error handling
for(int i = 0; i < 32; ++i){
//Some calculations to fill a[]
myfile.write((char*)&a,size*sizeof(unsigned long long));
}
myfile.close();
}
Run Code Online (Sandbox Code Playgroud)
使用Visual Studio 2010进行编译并完全优化并在Windows7下运行,此程序最大可达20MB/s.让我感到困扰的是,Windows可以将文件从其他SSD复制到此SSD,速度介于150MB/s和200MB/s之间.所以至少快7倍.这就是为什么我认为我应该能够更快.
我有什么想法可以加快我的写作速度?
我正在开发一个程序,该程序将处理可能大小为100GB或更大的文件.这些文件包含一组可变长度记录.我已经启动并运行了第一个实现,现在我正在寻求提高性能,特别是在输入文件被多次扫描时更有效地进行I/O.
mmap()通过C++的fstream库使用和读取块有经验吗?我想做的是从磁盘读取大块到缓冲区,从缓冲区处理完整记录,然后阅读更多.
该mmap()代码可能会变得非常凌乱,因为mmap"d块需要躺在页大小的边界(我的理解)和记录可能潜在般划过页面边界.使用fstreams,我可以寻找记录的开头并再次开始阅读,因为我们不仅限于阅读位于页面大小边界的块.
如何在不实际编写完整实现的情况下决定这两个选项?任何经验法则(例如,mmap()快2倍)或简单测试?
可能重复:
mmap()与读取块
我听说(在互联网上读取它)mmap()比顺序IO更快.它是否正确?如果是,那为什么它更快?
mmap() 不按顺序阅读.mmap()具有从盘面本身一样去取read()呢那么mmap()实际上应该比read()文件慢吗?我上面的哪些假设是错误的?
我有一个预先计算的整数数组,它的固定大小为15M.我需要在程序启动时加载这些值.目前加载最多需要2分钟,文件大小约为130MB.是加速加载的方法吗?我也可以自由更改保存过程.
std::array<int, 15000000> keys;
std::string config = "config.dat";
// how array is saved
std::ofstream out(config.c_str());
std::copy(keys.cbegin(), keys.cend(),
std::ostream_iterator<int>(out, "\n"));
// load of array
std::ifstream in(config.c_str());
std::copy(std::istream_iterator<int>(in),
std::istream_iterator<int>(), keys.begin());
in_ranks.close();
Run Code Online (Sandbox Code Playgroud)
提前致谢.
解决了.使用接受答案中提出的方法.现在它只需要一眨眼.
全心全意感谢您的见解.
我正在尝试共享像这个
例子的结构:
typedef struct {
int* a;
int b;
int c;
} ex;
Run Code Online (Sandbox Code Playgroud)
在进程之间,问题是当我使用malloc初始化'a'时,它变为私有的进程堆执行此操作(或者至少我认为这是发生的事情).有没有办法用这个有效的结构创建共享内存(使用shmget,shmat)?
编辑:我在Linux上工作.
编辑:我有一个初始化缓冲区的进程,如下所示:
key_t key = ftok("gr", 'p');
int mid = shmget(key, sizeof(ex), IPC_CREAT | 0666);
ex* e = NULL;
status b_status = init(&e, 8); //init gives initial values to b c and allocate space for 'a' with a malloc
e = (ex*)shmat(mid, NULL, 0);
Run Code Online (Sandbox Code Playgroud)
另一个进程将自己附加到共享内存,如下所示:
key_t key = ftok("gr", 'p');
int shmid = shmget(key, sizeof(ex), 0);
ex* e;
e = (ex*)shmat(shmid, NULL, 0);
Run Code Online (Sandbox Code Playgroud)
然后从a获取一个元素,在这种情况下,在位置1
int i …Run Code Online (Sandbox Code Playgroud) node.js存在mmap模块:https://github.com/bnoordhuis/node-mmap/
正如作者Ben Noordhuis指出的那样,访问映射内存可能会阻塞,这就是为什么他不再推荐它并停止使用它.
所以我想知道如何为node.js设计一个非阻塞内存映射模块?线程,纤维,?
显然,如果node.js中的线程只发生在其他地方而不是请求处理程序,那么这附近会引发一个问题.
我的问题如下:在某些情况下,人们使用 mmap 而不是从文件中读取。一种这样的代码是:
*mapping = mmap(NULL, *mapping_size, PROT_READ | PROT_WRITE,
MAP_POPULATE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
Run Code Online (Sandbox Code Playgroud)
上面的代码试图分配大量的内存。我想知道在这种情况下 mmap 是做什么的,它是如何工作的。每个人都在谈论 mmap wrt 文件的优势。但是这些 fd 设置为 -1 的代码很常见。这是什么意思,这样做有什么好处。?我希望有人能消除我的疑问,由于含糊不清,我无法完全提出疑问。
谢谢
如何处理(以只读方式)在一个大的二进制文件C/C++上Linux尽可能快?通过read或mmap?什么缓冲区大小?(没有提升或任何东西.)
据说mmap()将文件映射到内存,并且它花费在调用进程的虚拟地址空间内存中.它是否真的将数据复制到内存中,或者数据是否仍存在于磁盘中?是mmap()不是更快read()?