![]() |
![]() |
#1 |
高级会员
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 21
声望:
50
![]() 现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
大量数据存储和读取的问题
作者:jjgod 发表时间:2001年8月1日 12:08 -------------------------------------------------------------------------------- 这个问题一直比较迷惑,比如 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() 一次要半分钟。所以这里想问 问有没有更好的方法可以进行这种大容量的存储和读取? -------------------------------------------------------------------------------- 莫愁前路无知己,天下谁人不识君? 做成守护进程吧。 作者:Super 发表时间:2001年8月1日 16:19 -------------------------------------------------------------------------------- mapping file_info[]; int save(int t) { string info; int i; string *key; int flag; flag = 0; if (memory_info() > 5000000) { call_out("save",5); return 1; } if (t > sizeof(file_info)) {t = sizeof(file_info);flag = 1;} if (! mapp(file_info) || ! sizeof(file_info)) return 0; info = sprintf("version : %d\n", version); key = keys(file_info); for (i = t; i < t ; i++) { info += sprintf("%s : %d\n", key[i], file_info[key[i]]); } remove_all_callout(); if (flag == 1) return write_file(VERSION_FILE,info); call_out("save",0,t+30); return 1; } void create() { set("id","Saver_Storer"); seteuid(geteuid()); } void start_save() { save(0); } int write_file(string filename,mixed info) { write("save file done!\n"); return ::write_file(filename,info); } 这样储存时间虽然要长点,不过储存的时候应该感觉不到延迟的。 另外memory_info()的判断的大小,根据系统的负担而定。 re 作者:doing 发表时间:2001年8月1日 16:20 -------------------------------------------------------------------------------- save_object 可以保存 300k 的内容。至于 read_file 和 write_file 读写文件也没有 限制,完全看你的 buffer 或 string 的容量,这个是在配置里面指明的。 save_object 只是限制了递归的层次,这个也是在配置中指明的。 |
![]() |
![]() |