< 返回版块

lithbitren 发表于 2023-10-17 01:01

Tags:db

就比如说有一个超级大文件,我想局部修改[m, m + n]区间内的数据,我希望重新写入这个小区间后不会改变文件大小和在硬盘中的位置(?),而不是全文件读进内存后再整体重新刷进硬盘,这样的操作性能是不是高点?

这个是系统相关API吗,按windows和linux搜了搜没找到,搜partially modify file之类也搜不太清楚。

评论区

写评论
作者 lithbitren 2023-10-18 18:12

感谢指路,今天试了下,发现除了几个常用的功能大部分存储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++的,但是无所谓,概念是相通的。

Pikachu 2023-10-18 16:04

https://doc.rust-lang.org/std/os/linux/fs/trait.MetadataExt.html#tymethod.st_ino

你需要的不是rust知识而是操作系统知识。建议看看MIT6.828或者其它操作系统课程,了解一下文件系统和虚拟内存的具体实现。

如果你真的是打算做数据库的话,建议再看看MIT6.5830课程。你的多数问题都应该有现成的答案。能找到的课程可能多数是C/C++的,但是无所谓,概念是相通的。

作者 lithbitren 2023-10-18 01:26

就像一般变量可以用unsafe拿到指针地址usize值一样,硬盘被占用的内存应该也有地址和大小吧,应该怎么查看?

--
👇
lithbitren: 还有,有什么api可以检测文件有没有重新分配硬盘空间?

作者 lithbitren 2023-10-18 01:24

还有,有什么api可以检测文件有没有重新分配硬盘空间?

作者 lithbitren 2023-10-18 01:21

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就可以兼容各个系统了??

songzhi 2023-10-17 19:26

https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#tymethod.write_at

relufi 2023-10-17 17:29

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();

tokyohuang123 2023-10-17 15:42

内存映射的话 如果文件大于内存怎么办

hangj 2023-10-17 14:14

你平时是怎么读文件的?

Cherrs 2023-10-17 09:58
GUO 2023-10-17 09:00

没用过这个,不确定行不行。 但是使用操作系统的文件内存映射API是肯定可以的,而且这个API也是其它实现所谓高性能文件读写的基础。它是直接把文件数据映射到内存地址空间上,修改这个内存片段上的数据,等同于直接修改文件。

--
👇
jerryshell: std::io::Seek

jerryshell 2023-10-17 02:52

std::io::Seek

1 共 12 条评论, 1 页