就比如说有一个超级大文件,我想局部修改[m, m + n]
区间内的数据,我希望重新写入这个小区间后不会改变文件大小和在硬盘中的位置(?),而不是全文件读进内存后再整体重新刷进硬盘,这样的操作性能是不是高点?
这个是系统相关API吗,按windows和linux搜了搜没找到,搜partially modify file之类也搜不太清楚。
1
共 12 条评论, 1 页
就比如说有一个超级大文件,我想局部修改[m, m + n]
区间内的数据,我希望重新写入这个小区间后不会改变文件大小和在硬盘中的位置(?),而不是全文件读进内存后再整体重新刷进硬盘,这样的操作性能是不是高点?
这个是系统相关API吗,按windows和linux搜了搜没找到,搜partially modify file之类也搜不太清楚。
评论区
写评论感谢指路,今天试了下,发现除了几个常用的功能大部分存储api都是分系统。原理学过但没实践过细节缺失太多了,做数据库还不太敢想,如果有可能的话就做点小玩具,下一步有时间先实现个wal吧
--
👇
Pikachu: https://doc.rust-lang.org/std/os/linux/fs/trait.MetadataExt.html#tymethod.st_ino
你需要的不是rust知识而是操作系统知识。建议看看MIT6.828或者其它操作系统课程,了解一下文件系统和虚拟内存的具体实现。
如果你真的是打算做数据库的话,建议再看看MIT6.5830课程。你的多数问题都应该有现成的答案。能找到的课程可能多数是C/C++的,但是无所谓,概念是相通的。
https://doc.rust-lang.org/std/os/linux/fs/trait.MetadataExt.html#tymethod.st_ino
你需要的不是rust知识而是操作系统知识。建议看看MIT6.828或者其它操作系统课程,了解一下文件系统和虚拟内存的具体实现。
如果你真的是打算做数据库的话,建议再看看MIT6.5830课程。你的多数问题都应该有现成的答案。能找到的课程可能多数是C/C++的,但是无所谓,概念是相通的。
就像一般变量可以用unsafe拿到指针地址usize值一样,硬盘被占用的内存应该也有地址和大小吧,应该怎么查看?
--
👇
lithbitren: 还有,有什么api可以检测文件有没有重新分配硬盘空间?
还有,有什么api可以检测文件有没有重新分配硬盘空间?
https://doc.rust-lang.org/std/fs/struct.File.html
我平时都是用一般教程里std::fs::File method里面只有seek读,没有seek写,而且读也读不是按长度读,而且大多接触的文件不太大,整体内存读写也就那样。
今天看了帖子才知道原来还有read_at,write_at这样的api,就在页面下面的trait implement里,不过没写详细用法,用法在windows/unix的专用api里,然后linux却没有专门的对应。还是说按照unix页面的用法,直接调用std::fs::File的write_at就可以兼容各个系统了??
https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#tymethod.write_at
let mut file = std::fs::OpenOptions::new() .write(true) .open(r#"xxxxxx"#) .unwrap(); file.seek(SeekFrom::Start(m)).unwrap(); file.write_all(b"nnnnnn").unwrap();
内存映射的话 如果文件大于内存怎么办
你平时是怎么读文件的?
memap2?
没用过这个,不确定行不行。 但是使用操作系统的文件内存映射API是肯定可以的,而且这个API也是其它实现所谓高性能文件读写的基础。它是直接把文件数据映射到内存地址空间上,修改这个内存片段上的数据,等同于直接修改文件。
--
👇
jerryshell:
std::io::Seek
std::io::Seek