大量数据存储和读取的问题
2007/5/11 20:28:18

这个问题一直比较迷惑,比如 read_file 最多可以读多长
的文件,write_file 最多可以写多长的文件,save_object
最多可以存多大的内容。
最近在写一个取 mudlib 内所有文件进行时间比较的程序中
遇到了这个问题。这个程序主要是想取得所有文件的
last_touched_time 进行保存,下次进行此操作时再把目前
的信息与上次保存的信息进行比较,列出修改过的文件。比
如说我用下面的程序列出所有 / 下的文件:
string *deep_file_list(string dir)
{
        int i;
        string *flist, *result = ({ }), file;
        if (member_array(dir, exclude_dir) != -1)
        {
                return ({ });
        }
        flist = get_dir(dir);
        for (i = 0; i < sizeof(flist); i++)
        {
                file = dir + flist[i];
               
                if (file_size(file + "/") == -2)
                        result += deep_file_list(file + "/");
                else
                        result += ({ file });
        }
        return result;
}
然后再用下面的程序生成一个 mapping:
private void build_version()
{
        string *flist;
        int i, max;
        flist = deep_file_list("/");
        max = sizeof(flist);
        file_info = ([ ]);
        for (i = 0; i < max; i++)
        {
                if (! i % 100)
                        reset_eval_cost();
                file_info[flist[i]] = stat(flist[i])[1];
        }
        return;
}
一开始,我是继承了 F_SAVE,想用 save(); 来保存,结果
是存盘文件中除了 #/xxx/xxxx/xxx.c 之外没有任何数据,
于是我尝试用 write_file 的方法,即如下程序:
int save()
{
        string info;
        int i;
        string *key;
        if (! mapp(file_info) || ! sizeof(file_info))
                return 0;
        info = sprintf("version : %d\n", version);
        key = keys(file_info);
        for (i = 0; i < sizeof(file_info); i++)
        {
                info += sprintf("%s : %d\n", key[i], file_info[key[i]]);
        }
        return write_file(VERSION_FILE, info, 1);
}
写入是成功的,文件大概有将近 300K(我以前用 save_object
则保存过 150K 左右的文件)。
但是,用 read_file 来读这整个文件返回的是 0,于是我只好
用如下程序一行一行地来读:
void restore()
{
        string info;
        string file, line;
        string *lines;
        int time;
        int i;
       
        if (stringp(info = read_file(VERSION_FILE, 1, 1)))
        {
                sscanf(info, "version : %d", version);
                for (i = 2; ; i++)
                {
                        if (! stringp(line = read_file(VERSION_FILE, i, i)))
                                break;
                        if (sscanf(line, "%s : %d", file, time) == 2)
                                file_info[file] = time;
                        if (! i % 100)
                                reset_eval_cost();
                }
        }
}
以上程序经过测试确实使可以运行的,但运行起来就非常的慢
了,大概 save() + restore() 一次要半分钟。所以这里想问
问有没有更好的方法可以进行这种大容量的存储和读取? 
----------------------------------------------------------------------

下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms