我有一个项目,我必须在从兆字节到太字节的数据上实现快速搜索,插入和删除操作.我最近一直在研究数据结构并对其进行分析.具体而言,我想介绍3个案例并就此提出问题:
数据远远超过内存可以处理的内容(样本范围为10-15太字节).在这种情况下,我会将数据结构存储在磁盘上.
与系统的存储器相比,数据相对较少,因此可以在存储器本身中存储和操作以提高速度.
数据不仅仅是空闲内存,并且假设它小于页面文件中可能连续数据块的大小.因此,我将数据结构存储在磁盘上的文件中,并对文件进行内存映射.
我得出的结论是:
对于情况1,我应该使用B树来更快地访问,因为它可以节省磁盘旋转产生的延迟
对于案例2,我应该使用红黑树来加快访问速度,因为数据存储在内存中,没有.如果我使用B树,那么在更糟糕的情况下需要扫描的元素将小于我必须要扫描的元素
对于案例3,我怀疑这一点,页面文件在磁盘上使用本机OS I/O来操作文件,那么B Tree应该是更好的选择还是红黑树?
我想知道上述三个结论在哪里正确,哪里出错,以及如何在三个不同的案例中改进绩效.
我使用的是C++语言,有一个红黑树和一棵B树,这些都是我从头开始设计的.我正在使用Boost库进行文件映射.
Update 1 ::正在阅读stackoverflow中的这篇文章.得到了一些真正好的见解,让我觉得我在案例中所做的比较类型可能有问题.最受欢迎的答案中发布了一个链接http://idlebox.net/2007/stx-btree/stx-btree-0.8.3/doxygen-html/speedtest.html
b-tree red-black-tree large-data data-structures file-mapping
我有一个循环缓冲区,支持文件映射内存(缓冲区的大小范围为8GB-512GB).
我从开始到结束以顺序的方式写入(8个实例)此内存,此时它循环回到开头.
它工作正常,直到它需要执行两个文件映射并循环内存,此时IO性能完全被破坏并且无法恢复(即使在几分钟后).我无法弄明白.
using namespace boost::interprocess;
class mapping
{
public:
  mapping()
  {
  }
  mapping(file_mapping& file, mode_t mode, std::size_t file_size, std::size_t offset, std::size_t size)
    : offset_(offset)
    , mode_(mode)
  {     
    const auto aligned_size         = page_ceil(size + page_size());
    const auto aligned_file_size    = page_floor(file_size);
    const auto aligned_file_offset  = page_floor(offset % aligned_file_size);
    const auto region1_size         = std::min(aligned_size, aligned_file_size - aligned_file_offset);
    const auto region2_size         = aligned_size - region1_size;
    if (region2_size)
    {
      const auto region1_address  = mapped_region(file, read_only, 0, (region1_size + region2_size) * 2).get_address(); 
      const auto region2_address …我正在开发一个需要处理大量数据(以GB为单位)的应用程序。我不需要任何时候一次获取所有数据。可以对数据进行分段并仅在任何给定实例上处理(从而将其存储到内存中)分段。
我了解到,大多数需要处理大量数据的应用程序通常都是通过使用内存映射文件来完成的。进一步阅读有关内存映射文件的信息,我发现从内存映射文件读取数据/向内存映射文件写入数据的速度比普通文件IO快,因为我们最终使用了高度优化的页面文件算法来执行读写操作。
这是我的查询:
现在我可以通过/proc/meminfo知道系统总体的缓存页面,那么我是否可以进一步知道对于一个特定的进程它消耗了多少页面缓存?我的第一个想法是将进程的 smap 中的所有 RSS 相加。还有更多建议吗?谢谢。
我想将数据库从我们SQL Server 2008的PostgreSQL server.
问题是,在Import/Export Wizard中Wizard说,他无法找到正确的文件到正确转换。(如果我继续他导出而不检查导致错误转换的原因-> 数据不会导出,只有表定义)
我相信解决方案是制作请求的文件 - 但我不知道如何。这是XML-files您在其中找到的两个:
C:\Program Files (x86)\Microsoft SQL Server\110\DTS\MappingFiles
我在这些网站上找到了一些信息,但我无法将这些信息放在一起以使其有意义:
我正在使用 SQL Server Studio Management 2017,通过 .Net Framework Data Provide for Odbc 导出。我的计划是文件 alá MSSql10ToODBC.XML 和 SSIS10ToODBC.XML
有没有人做过这个或任何想法我能做什么?
我需要读取一组文件并将其分解为键值对,并将这些文件保存为光盘上该键的(键,值列表),就像map-reduce范例一样.但是一切都在一台电脑上.例如,我可以在不同文件上写入不同的列表,并使用密钥命名文件.这似乎是一种非常糟糕的做事方式.首先,如果你有十亿个密钥,你将得到十亿个文件.显然这不会起作用,我需要某种内存映射.我还必须有不同的线程来做map工作,所以如果他们要写入这个相同的缓冲区,它们之间必须有某种同步.如果我有一个键值缓冲区映射,并通过缓冲区同步,那么线程不应该踩到彼此的脚趾,所以我认为该部分应该工作.问题是如何将值映射到光盘.如何编写与同一文件中不同键对应的缓冲区?如果有人能指出我正确的方向,我将不胜感激.我对这方面的了解非常可怜.再次感谢.
我有一个非常大的文件,我需要以小块读取它,然后处理每个部分.我正在使用MapViewOfFile函数来映射内存中的一块,但在读完第一部分后我无法读取第二部分.当我试图映射它时它会抛出.
    char *tmp_buffer = new char[bufferSize];
    LPCWSTR input = L"input";   
    OFSTRUCT tOfStr;
    tOfStr.cBytes = sizeof tOfStr;
    HANDLE inputFile = (HANDLE)OpenFile(inputFileName, &tOfStr, OF_READ); 
    HANDLE fileMap = CreateFileMapping(inputFile, NULL, PAGE_READONLY, 0, 0, input);
    while (offset < fileSize)
    {
        long k = 0;
        bool cutted = false;
        offset -= tempBufferSize;
        if (fileSize - offset <= bufferSize)
        {
            bufferSize = fileSize - offset;
        }
        char *buffer = new char[bufferSize + tempBufferSize];
        for(int i = 0; i < tempBufferSize; i++)
        {
            buffer[i] = tempBuffer[i];
        } …在Windows应用程序中,我有一个包装文件名和缓冲区的类.您使用文件名构造它,您可以查询对象以查看缓冲区是否已填充,如果没有则返回nullptr,如果是,则返回缓冲区地址.当对象超出范围时,释放缓冲区:
class file_buffer
{
public:
    file_buffer(const std::string& file_name);
    ~file_buffer();
    void* buffer();
private:
    ...
}
我想异步将数据放入内存,据我所知,我有两个选择:创建一个缓冲区并通过ReadFileEx使用重叠IO,或者使用MapViewOfFile并触摸另一个线程上的地址.
目前我正在使用ReadFileEx,这会出现一些问题,因为大于16MB的请求容易出现故障:我可以尝试拆分请求,但后来我遇到同步问题,如果在IO之前对象超出范围完成我有缓冲区清理问题.此外,如果快速连续创建类的多个实例,则会非常繁琐.
映射和触摸另一个线程上的数据似乎相当容易,因为我没有上限问题:如果客户端现在绝对必须拥有数据,他们可以简单地取消引用地址,让操作系统担心页面错误并采取阻止命中.
这个应用程序需要支持单核机器,所以我的问题是:另一个软件线程的页面错误是否会比当前线程上的重叠IO更昂贵?他们会拖延这个过程吗?重叠的IO是否以相同的方式停止进程,或者是否存在一些我不明白的操作系统魔法?是否使用重叠IO执行页面错误?
我已经很好地阅读了这些主题:http: //msdn.microsoft.com/en-us/library/aa365199(v = vs.85).aspx(文件管理中的IO概念) http:// msdn. microsoft.com/en-us/library/windows/desktop/aa366556 (v=vs.85) .aspx(文件映射),但我似乎无法推断如何进行性能权衡.
我想知道是否这个代码片段:
HANDLE fhandle = CreateFile("something.c", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE mapping = CreateFileMapping(fhandle, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID map_view = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
以下释放对象的顺序有效:
CloseHandle(mapping);
CloseHandle(fhandle);
UnmapViewOfFile(contents);
即我可以先关闭文件句柄然后再打电话UnmapViewOfFile吗?
我知道执行顺序CloseHandle(mapping)和UnmapViewOfFile(contents)无关紧要,但是关闭文件句柄呢?
我问,因为我只想使用map_view析构函数的指针.在我看来,这是有效的,文件一直保持到UnmapViewOfFile调用,但也许这可能会导致一些奇怪的行为?
file-mapping ×10
c++ ×4
winapi ×4
boost ×2
file-io ×2
b-tree ×1
c ×1
concurrency ×1
createfile ×1
file ×1
interprocess ×1
java ×1
kernel ×1
large-data ×1
linux-kernel ×1
postgresql ×1
sql-server ×1
ssis ×1
ssis-2008 ×1
windows ×1
windows-7 ×1