| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 362 人关注过本帖
标题:程式要进版~求思路~
只看楼主 加入收藏
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:485
专家分:919
注 册:2012-10-26
结帖率:95.45%
收藏
已结贴  问题点数:20 回复次数:5 
程式要进版~求思路~
目标是二进制档案合并~但是并不是那么简单~把档案接起来就好了~
目前写法受限于电脑效能高低~造成使用者要挑选高性能电脑去运行~
于是想当然就是要做切割处理~理论上会影响效能~
但是为了降低使用门槛~已知有固定数据结构的档案~
之前是直接全都读進内存~再依照指针移动搜索关键字~
合并特定档案后~再依照特定数据计算重整出最后的结果~
不知道有没有高人能提供算法~能在尽量减少效能损耗下~
将和N个档案合并~总共预估完成档先定为1.5GB到2.0GB左右~
以每200MB为一个单位~截取到数据阵列中再依特定規則处理~
当然考虑到最后会有不完整的区段~就将此区并到到第二个200MB阵列中继续处理~
两个阵列交互使用尽量节省IO存取次数~以最快速低耗能的方式~
解决这个问题~请各位大神给点思路吧~预计以纯Ç方式编写~
因为对于C++和MFC熟悉度上还有限~预想此次应该会使用到大量数据结构~
新手请教请多包涵~
搜索更多相关主题的帖子: 档案 关键字 二进制 影响 
2013-01-25 00:49
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:7 
友情飘过...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-01-25 08:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:7 
楼主,俺没看懂你的需求。
我猜,你是不是想在一个巨大的文件中搜索某个信息,但不想将文件一下子全部读进内存?
如果这样的话,用 内存映射,Windows下是CreateFileMapping,Linux下是mmap。
2013-01-25 08:50
Mirob
Rank: 4
来 自:农村
等 级:业余侠客
帖 子:191
专家分:264
注 册:2012-7-20
收藏
得分:7 
我是来接分的,凑个热闹。
2013-01-25 10:52
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:485
专家分:919
注 册:2012-10-26
收藏
得分:0 
以下是引用rjsp在2013-1-25 08:50:50的发言:

楼主,俺没看懂你的需求。
我猜,你是不是想在一个巨大的文件中搜索某个信息,但不想将文件一下子全部读进内存?
如果这样的话,用 内存映射,Windows下是CreateFileMapping,Linux下是mmap。


大概是这样没错~
档案中有些重复段要去除~
有些段落要做接续合并~
有些段落要依据合并后的完整资料做重新计算~
最后生成一个新的巨大文件档案~

CreateFileMapping 感谢提供~正在查询相关资讯~

在N个巨大的文件中搜索某些特定信息,但不想批次将N个巨大的文件一下子全部读进内存~

[ 本帖最后由 yz1025 于 2013-1-25 14:04 编辑 ]

不要投我
2013-01-25 13:55
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:485
专家分:919
注 册:2012-10-26
收藏
得分:0 
看了一下资料~看得莫名其妙~感觉像是不把档案放实体内存而放虚拟内存中~
而档案放入虚拟内存前会先进行资料切割的动作~切割大小可自订~
切完系统会自创出虚拟档案的指针~再依照指针去辨识虚拟档案中的资料~循环处理~
问题是资料不存在内存~要怎么调试时调用内存监看~怎知道指针所指的位置资料是否是自己要的吗?

程序代码:
#include "stdafx.h"
#include <locale.h>
#include <windows.h>
#include <tchar.h>
#include <ole2.h>

//#define FILE_MAP_START 0x28804    //文件映射起始位置
#define FILE_MAP_START 0x00000        //文件映射起始位置
#define BUFSIZE    1024                // 内存大小

int _tmain(int argc, char* argv[])
{
    printf("Hello World!\n");

    char* g_pszOriLocale = setlocale (LC_ALL, "CHS");

 
    HANDLE    hMapFile;                // 文件内存映射区域的句柄
    HANDLE  hFile;                    // 文件的句柄
     
    DWORD    dBtyesWritten;            // 写入的字节数
    DWORD    dwFileSize;            // 文件大小
    DWORD    dwFileMapSize;            // 文件映射的大小
    DWORD    dwMapViewSize;            // 视图(View)大小
    DWORD    dwFileMapStart;        // 文件映射视图起始位置
    DWORD    dwSysGran;                // 系统内存分配粒度
     
    SYSTEM_INFO    SysInfo;            // 系统信息
    LPVOID    lpMapAddress;            // 内存映射区域起始位置
    PCHAR    pData;                    // 数据
 
    INT    i;                        // 循环变量
    INT iData;
    INT iViewDelta;            

 
    BYTE cMapBuffer[8]={0};        // 存储从 mapping 中读出的数据

 
    //创建一个文件
    hFile = CreateFile (argv[1], GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     
    if (hFile == INVALID_HANDLE_VALUE) {
        printf ("Create file error\n");
        return (-1);
    }

    //依次写入整数,一共 65535 个,共 65535*4 个字节
    for (i = 0; (DWORD)i <= 65535; i++)
        WriteFile (hFile, &i, sizeof(i), &dBtyesWritten, NULL);
     
    //检查写入后文件的大小
    dwFileSize = GetFileSize (hFile, NULL);
    _tprintf (TEXT("文件大小:%d\n"), dwFileSize);

 
    //获取系统信息,内存分配粒度(64K)
    //下面几个计算是为了映射的数据与系统内存分配粒度对其,提高内存访问效率
    
    GetSystemInfo (&SysInfo);

 
    dwSysGran = SysInfo.dwAllocationGranularity;                    //内存分配粒度,一般为 64KB

 
    //计算 mapping 起始位置
    dwFileMapStart = (FILE_MAP_START / dwSysGran) * dwSysGran;

 

 
    dwMapViewSize = (FILE_MAP_START % dwSysGran) + BUFSIZE;            //mapping view 大小
 

 
    dwFileMapSize = FILE_MAP_START + BUFSIZE;                        // mapping 的大小 
 
    iViewDelta = FILE_MAP_START - dwFileMapStart;                    // 需要读取的数据的便宜
 

 
    hMapFile = CreateFileMapping ( hFile,                            // 需要映射的文件句柄
                                   NULL,                            // 使用默认安全选项
                                   PAGE_READWRITE,                    // 可读,可写
                                   0,                                // mapping 对象的大小,高位
                                   dwFileMapSize,                    // mapping 对象的大小,低位
                                   NULL);
    if (hMapFile == NULL) {
        printf ("CreateFileMapping error : %d\n", GetLastError());
        return (-2);
    }

 
    // 映射 view
    lpMapAddress = MapViewOfFile ( hMapFile,                        // mapping 对象的句柄
                                   FILE_MAP_ALL_ACCESS,                // 可读,可写
                                   0,                                // 映射的文件偏移,高位
                                   dwFileMapStart,                    // 映射的文件偏移,低位
                                   dwMapViewSize);                    // 映射到 View 的文件大小

 
    //-------------------------------------------------------------------------------------------//
    _tprintf (TEXT("文件视图(map view)相对于文件的起始位置:0x%x\n"), dwFileMapStart);
  
    _tprintf (TEXT("文件视图(map view)的大小:0x%x\n"), dwMapViewSize);
  
    _tprintf (TEXT("文件映射对象的大小:0x%x\n"), dwFileMapSize);
  
    _tprintf (TEXT("从相对于文件视图(map view)的 0x%x 字节处读取数据为:"), iViewDelta);
    //-------------------------------------------------------------------------------------------//

    pData = (PCHAR)lpMapAddress + iViewDelta;                        //设置指针
 
    iData = *(PINT)pData;                                            //读取一个数据
 
    _tprintf (TEXT("0x%.8x\n"), iData);

 
    CloseHandle (hMapFile);
    CloseHandle (hFile);

 
    return 0;
}

不要投我
2013-01-25 16:50
快速回复:程式要进版~求思路~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017242 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved