相关疑难解决方法(0)

用C++编写二进制文件的速度非常快

我正在尝试将大量数据写入我的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倍.这就是为什么我认为我应该能够更快.

我有什么想法可以加快我的写作速度?

c++ io optimization performance file-io

221
推荐指数
8
解决办法
17万
查看次数

虚拟内存是无限的?

我在接受采访时被问到虚拟内存是无限的吗?我回答说这不是无限的.然后面试官问了解释,我建议的是,在Windows中,我们确实有一种手动方式将虚拟内存配置到一定限度.

我想知道虚拟内存是否真的无限?

memory

13
推荐指数
1
解决办法
1万
查看次数

查找8GB +文本文件中的"密钥"

我有一些'小'文本文件,包含大约500000个条目/行.每行还有一个"键"列.我需要在一个大文件中找到这个密钥(8GB,至少2.19亿条目).找到后,我需要将大文件中的'Value'附加到小文件中,在行的末尾作为新列.

像这样的大文件:

KEY                 VALUE
"WP_000000298.1"    "abc"
"WP_000000304.1"    "xyz"
"WP_000000307.1"    "random"
"WP_000000307.1"    "text"
"WP_000000308.1"    "stuff"
"WP_000000400.1"    "stuffy"
Run Code Online (Sandbox Code Playgroud)

简单地说,我需要在大文件中查找"密钥".

显然我需要在RAM中加载整个表(但这不是我有32GB可用的问题).大文件似乎已经排序了.我得检查一下.
问题是我无法使用类似TDictionary的快速查找,因为正如您所看到的,密钥并不是唯一的.

注意:这可能是一次性计算.我将使用该程序一次,然后扔掉它.因此,它不一定是最佳算法(难以实现).它只需要在适当的时间内完成(如1-2天).PS:我更喜欢没有DB这样做.

我正在考虑这个可能的解决方案:TList.BinarySearch.但似乎TList仅限于134,217,727(MaxInt div 16)项目.所以TList不会工作.


结论:
我选择了Arnaud Bouchez解决方案.他的TDynArray令人印象深刻!如果你需要处理大文件,我完全推荐它.
AlekseyKharlanov提供了另一个不错的解决方案,但TDynArray已经实现.

delphi sorting algorithm search

13
推荐指数
3
解决办法
1960
查看次数

为什么mmap在iOS上失败?

我正在尝试使用mmap在iOS上读取和播放音频文件.它适用于高达约400MB的文件.但是当我尝试500MB文件时,我收到ENOMEM错误.

char *path = [[[NSBundle mainBundle] pathForResource: @"test500MB" ofType: @"wav"] cStringUsingEncoding: [NSString defaultCStringEncoding]];
FILE *f = fopen( path, "rb" );
fseek( f, 0, SEEK_END );
int len = (int)ftell( f );
fseek( f, 0, SEEK_SET );

void *raw = mmap( 0, len, PROT_READ, MAP_SHARED, fileno( f ), 0 );

if ( raw == MAP_FAILED ) {
    printf( "MAP_FAILED. errno=%d", errno ); // Here it says 12, which is ENOMEM.
}
Run Code Online (Sandbox Code Playgroud)

为什么?

我很高兴得到一个答案,例如"700MB是虚拟内存限制,但有时地址空间是碎片化的,所以你要获得700MB但是更小的块".(这只是推测,我还是需要回答)

关于虚拟内存的Apple文档页面说:

虽然OS X支持后备存储,但iOS不支持.在iPhone应用程序中,磁盘上已有的只读数据(例如代码页)只是从内存中删除,并根据需要从磁盘重新加载.

这似乎证实了mmap应该适用于大于物理内存的块,但仍然无法解释为什么我会达到如此低的限制.

更新

memory-management mmap ios

12
推荐指数
1
解决办法
6833
查看次数

在 UNIX 进程之间交换中等大量数据的最佳方法是什么?

在 UNIX 进程之间交换中等大量数据(数兆字节,但不是千兆字节)的最佳方法是什么?

我认为,这将是内存映射文件,因为大小限制似乎足够可以忍受。

我需要双向通信,所以普通管道没有帮助。据我所知,套接字和 UDP 存在大小限制(另请参阅此处)。不确定 TCP 是否是在 . 的子进程和父进程之间进行通信的好主意fork()

阅读诸如此类的相关问题,有些人推荐了共享内存/ mmap,其他人推荐了套接字。

还有什么我应该调查的吗?例如,是否有一些更高级别的库可以通过提供数据的 XML 序列化/反序列化来帮助 IPC?

根据评论进行编辑:

在我的特殊情况下,有一个父/控制器进程和几个子进程(不能使用线程)。控制器根据要求向儿童提供一些可能适合一个 UDP 数据包的关键数据。孩子们对按键数据进行操作,并向控制器提供基于按键的信息(信息大小可以是10-100MB)。

问题:响应数据的大小、通知父级有关密钥请求的机制、同步 - 父级在传递给子级后必须从其列表中删除密钥,不应发生重复的密钥处理。

Boost 和其他第三方库(不幸的是)不得使用。我也许可以使用SunOS 5.10系统提供的库。

c c++ serialization ipc mmap

3
推荐指数
1
解决办法
2716
查看次数

使用 numpy 内存映射的 64 位系统中文件的最大大小是多少

我正在尝试处理一个大约 50 GB 的大文件。我正在尝试使用 numpy 内存映射访问该文件。我看到用于内存映射的文件大小有限制,32 位系统为 2GB。这是链接:https : //docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.memmap.html

我想知道使用 numpy 内存映射对文件大小是否有硬限制以获得良好的性能。

python numpy memory-mapped-files memory-mapping numpy-memmap

2
推荐指数
1
解决办法
1526
查看次数