目前我正在研究一个读写磁盘的MFC应用程序.有时这个应用程序运行得非常快,有时候它很慢.我猜这是因为涉及磁盘访问,因此我想对其进行分析.这些是这方面的一些问题:
(1).目前我正在使用AQTime分析器来分析应用程序.有没有人试过使用它来分析磁盘访问?或者还有其他可以使用的工具吗?
(2).我应该关注哪些最重要的磁盘参数?
(3).如果我有多个线程试图从磁盘读取和写入数据会影响性能吗?即我最好有一个单独的线程访问磁盘?
我正在寻找一种适用于基于大块的设备(例如机械硬盘驱动器)的算法/数据结构,该设备针对插入,获取,更新和删除进行了优化,其中总是使用数据的id和数据来完成搜索任何ID的字段都有可变长度.
B树似乎是一个常见的引用结构,但主要用于固定长度记录.我也期望获得和更新的次数比插入和删除的次数多得多.我可以摆脱B树的O(log m)查找吗?
我很高兴它成为一个组合系统,例如ISAM结合了B树和线性文件存储,看起来它可以作为一种方法使用可变长度记录.还有更好的东西吗?
进一步的限制:
1)ID可能是稀疏的,但可以使它们成为线性数字块 - 但是在大范围内(64位)
2)我不想使用DBMS,性能对于我的特定问题并没有证明是非常好的.我不需要完整DBMS使用的任何操作,我不需要搜索.我需要一些可以轻松调整和优化的东西.称之为学术好奇心,如果它由MySQL执行,那么我将使用它,但我必须尝试更快.
3)数据集大于可以适合内存的数据集,但是如果它像key,offset一样简单,那么索引可能很好地适合内存.我当然在寻找存储中10亿个或更多实体的东西.
4)理想情况下,删除记录时应恢复空间.这可能是通过压缩,但我有兴趣看看是否有更好的方法(例如B树很容易恢复空间).
我有一个 UITableView,其单元格包含从 Internet 异步加载图像的自定义 ImageView。要加载这些图像,我使用 NSURLRequest 和 NSURLConnection 工作正常。唯一的问题是图像没有缓存,因此每次使用时都会下载。我试图将 NSURLRequest 的 cachePolicy 设置为“NSURLRequestReturnCacheDataElseLoad”,但没有任何效果。
从链接上的最后一个答案看来,iPhone 上的 NSURLRequest 不支持磁盘缓存。这样对吗?
如果它真的有效,我很想知道在我的情况下它不起作用的原因是什么。
这是代码:
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myurl"] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
Run Code Online (Sandbox Code Playgroud) 我正在阅读Silberschatz的OS书.在第16.8.1节中,它说:
电梯算法的基本问题是在磁盘的特定区域中进行的I/O操作可能导致需要在磁盘的其他区域中发生的请求的缺乏.
C-SCAN算法按顺序处理所有扇区,如本网页所示.
我不明白这是如何导致一些请求无限期等待的.
我尝试使用Win32_DiskDrive获取磁盘的最大总扇区,但它们都返回错误的值。我使用HxD,该程序返回准确的值。我尝试使用 fdisk 获取 Linux 中的总扇区,它也准确返回。
我注意到Win32_DiskDrive MSDN中有一条注释如下:
该属性的值是通过 BIOS 中断 13h 的扩展功能获得的。如果驱动器使用转换方案来支持高容量磁盘大小,则该值可能不准确。请咨询制造商以获取准确的驱动器规格。
但我没明白这是什么意思?以及如何解决这个问题?
这是我的 python 脚本的片段代码。
import wmi
c = wmi.WMI()
for diskDrive in c.query("SELECT * FROM Win32_DiskDrive"):
print diskDrive.Name, "\nTotal Sector: ", diskDrive.TotalSectors
Run Code Online (Sandbox Code Playgroud)
根据要求,这里是检测到 HxD 总扇区的 WMI 片段。

如果有兴趣,你也可以在自己的计算机上尝试一下,看看Win32_DiskDrive是否报告准确的结果。我在许多其他计算机(WinXP & 7)和其他存储设备(硬盘、闪存盘等)上尝试过此操作,但所有结果都不准确。
非常感谢
我最接近最终理解磁盘 btree 架构的是这个.
它很简单,很容易阅读和理解。但是我还是觉得很迷茫。似乎根本没有内存数据结构。我错过了什么吗?是什么让这成为一个 btree?是否只是“指向”其子节点键的 long 数组?这样有效率吗?大多数数据库和文件系统就是这样设计的吗?
是否有在内存中的磁盘 btree(或其他数据结构)上实现的方法?每个节点在哪里包含文件偏移量之类的?
在阅读磁盘结构时,我发现块大小是扇区大小的倍数。第一个想法是,当你有扇区时,为什么你甚至需要块,其次,为什么块大小是扇区的倍数,如 1、2、4?
为什么不能是扇区的一半?这里面的道理是什么?这不是为了家庭作业。
今天我意识到版本控制下的文件夹中隐藏的 .svn 文件夹占用了大约 16 GB 的硬盘空间。我正在使用 SSD 驱动器,所以这是相当多的。我真的需要这些巨大的子文件夹吗?据我所知,它们用于管理,但为什么它们与版本控制下的文件夹大小大致相同?
谢谢!
我面临着在docker容器上拥有磁盘配额的要求.具体来说,我想限制不在基本图像层中但在差异中的数据量.谷歌搜索"docker disk quota"建议使用设备映射器或btrfs后端.虽然能够在两个后端(具有不同的语义)中具有配额,但两者都存在问题:
解决这个问题的最佳方法是什么?
我的应用程序完全是用 java 编写的(我们从 java8 迁移到 java11)并且在 High Sierra 下运行良好:
new RandomAccessFile(file_on_network_volume, "rws")获得访问权限并继续执行。
在Catalina下运行它失败了
java.io.FileNotFoundException: /Volumes/messages/xyz/FILE.xdt (Operation not permitted)
我知道任何尝试访问网络卷的应用程序都需要特殊权限,我在系统偏好设置中查看了它们,可以将它们删除以tccutil reset SystemPolicyNetworkVolumes [bundle_id]进行重复测试。
java 代码如何正确请求用户的访问权限,以便处理可以继续?
到目前为止我做了什么:
AccessController.doPrivileged((PrivilegedExceptionAction<RandomAccessFile>) () -> new RandomAccessFile(file, "rws")); <key>NSNetworkVolumesUsageDescription</key> <string>@@bundle_name@@ benötigt Zugriff auf ein Netzwerkvolume.</string> 但仍然缺少一些东西。应用程序未请求权限,因此操作失败。IntelliJ 做了一些我目前还没有弄清楚的正确的事情。