大量数据存储和读取的问题
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