我正在按顺序将实时数据写入空的旋转磁盘.(编辑:它不必是连续的,只要我可以读回,如果它是顺序的.)在100 MB的速率的数据到达/ s和盘具有120 MB的平均写入速度/秒.
有时(特别是当可用空间开始减少时)磁盘速度低于100 MB/s,具体取决于磁盘写入盘片的位置,我必须丢弃重要数据.
有没有办法以一种模式(或其他方式)写入磁盘,以确保接近平均速率的恒定写入速度?无论磁盘上当前有多少数据.
编辑:
关于为什么我认为这应该成为可能的一些注释.
当通常写入磁盘时,它从盘片的快速部分开始,然后写入较慢的部分.但是,如果我可以将一半数据写入快速部分,将一半数据写入慢速部分(即1秒钟可以写入50MB到快速部分,50MB写入慢速部分),它们应该在中间相遇.我可以达到一个恒定的速度?
作为一名程序员,我不知道如何确定数据写在盘子上的位置,或者即使操作系统可以实现类似的功能.
我想使用iPhone OS上的objective-c直接从URL下载文件到磁盘.
目前我正在使用NSURLConnection发送synchronousRequest,将返回的NSData写入文件.
如何更改下载处理(仍然有请求同步,它已经在后台线程中)将数据直接写入磁盘,而不是使用内存变量来存储完整的内容(只有小部分)?
一个示例代码将不胜感激.
提前感谢您的回复!
我试图列出系统可能具有的磁盘驱动器.
在Windows上,它可能类似于"C:/","D:/","E:/".
在Linux上,它可能类似于"/ boot","/ media/SDCard"等.
我不知道它在Mac上是什么样的.也许/ Volumes下的东西.
有没有人知道Python中的跨平台方式(即在Linux,Windows和Mac上运行的方式)?
谢谢!
哦:快速说明,我正在运行Python 2.6.
使用下面的代码,我能够在我的机器上成功打开原始磁盘,但是当我得到磁盘长度时,我每次都得到0 ...
// Where "Path" is /dev/rdisk1 -- is rdisk1 versus disk1 the proper way to open a raw disk?
Device = open(Path, O_RDWR);
if (Device == -1)
{
throw xException("Error opening device");
}
Run Code Online (Sandbox Code Playgroud)
使用这两种方法获取大小将返回0:
struct stat st;
if (stat(Path, &st) == 0)
_Length = st.st_size;
Run Code Online (Sandbox Code Playgroud)
/
_Length = (INT64)lseek(Device, 0, SEEK_END);
lseek(Device, 0, SEEK_SET);
Run Code Online (Sandbox Code Playgroud)
我并不完全熟悉非Windows平台上的编程,所以请原谅任何看似奇怪的东西.我的问题是:
有问题的磁盘是一个未格式化的磁盘,但对于那些想要从磁盘工具中获取信息的人(删除了非重要的东西):
Name : ST920217 AS Media
Type : Disk
Partition Map Scheme : Unformatted
Disk Identifier : disk1
Media Name : …Run Code Online (Sandbox Code Playgroud) 我假设Windows与Linux的页面缓存有类似的概念,用于存储来自磁盘的内存数据,如文件,可执行文件和动态库.我想知道是否有可能禁用这样的缓存或至少清除/清除它.
我现在有3个报告用户的机器在使用我的软件时崩溃..崩溃与我的程序无关,但是当他们重新启动配置文件时,我的程序写入都是损坏的.
编写文件没有什么特别之处,只需创建一个Json表示并使用File.WriteAllText()将其转储到磁盘上
// save our contents to the disk
string json = JsonConvert.SerializeObject(objectInfo, Formatting.Indented);
// write the contents
File.WriteAllText(path, json);
Run Code Online (Sandbox Code Playgroud)
我有一个用户发给我一个文件,长度看起来正确(~3kb),但内容都是0x00.
根据下面的帖子,File.WriteAllText应该关闭文件句柄,将任何未写入的内容刷新到磁盘:
但正如Alberto在评论中指出的那样:
System.IO.File.WriteAllText完成后,将所有文本刷新到文件系统缓存,然后,它将被懒惰地写入驱动器.
所以我认为这里发生的事情是文件被清除并用0x00初始化,但是当系统崩溃时数据还没有被写入.
我想可能使用某种临时文件,所以过程将是这样的:
我认为这不会解决问题,因为我认为即使IO仍处于待决状态,Windows也只会移动文件.
有什么方法可以强制机器将数据转储到磁盘而不是决定何时进行,或者更新文件更好的方法?
更新:
基于@usr,@ mikez和@llya luzyanin的建议,我创建了一个新的WriteAllText函数,它使用以下逻辑执行写入:
有了这个逻辑,如果最终文件加载失败,我的代码会检查备份文件并加载它
这是代码:
public static void WriteAllTextWithBackup(string path, string contents)
{
// generate a temp filename
var tempPath = Path.GetTempFileName();
// create the backup name
var backup = path + ".backup";
// delete any existing backups
if (File.Exists(backup))
File.Delete(backup);
// get the …Run Code Online (Sandbox Code Playgroud) 这是我到目前为止所拥有的:
import os.path as op
for d in map(chr, range(98, 123)): #drives b-z
if not op.isdir(d + ':/'): continue
Run Code Online (Sandbox Code Playgroud)
问题是它在Windows中弹出一个"No Disk"错误框:
maya.exe - 无磁盘:驱动器中没有磁盘.请将磁盘插入驱动器\ Device\Harddisk1\DR1 [取消,重试,继续]
我无法捕获异常,因为它实际上没有抛出Python错误.
显然,这只发生在已分配字母但未插入驱动器的可移动驱动器上.
有没有办法解决这个问题,而没有特别告诉脚本哪些驱动器跳过?
在我的场景中,我在学校实验室,驱动器号码根据我所在的实验室计算机而变化.此外,我没有访问磁盘管理的安全权限.
假设下面的方法被.net 4应用程序中的不同线程调用了几千次.处理这种情况的最佳方法是什么?了解磁盘是这里的瓶颈,但我希望WriteFile()方法快速返回.
数据可以高达几MB.我们在谈论线程池,TPL等吗?
public void WriteFile(string FileName, MemoryStream Data)
{
try
{
using (FileStream DiskFile = File.OpenWrite(FileName))
{
Data.WriteTo(DiskFile);
DiskFile.Flush();
DiskFile.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
Run Code Online (Sandbox Code Playgroud) Linux中有许多程序可以显示文件的大小,其中一些以块为单位显示,有些以字节为单位.但是当谈到一些人类可读的形式,比如ls -sh,lvs,dd bs = size等等,当我们看到kb,KB,mB,MB,K时,我们如何判断它是1024还是1000的倍数?有些人将它们与像lvs这样的大写字母区分开来,有些像dd这样有不同的字符,但是,这些东西是否有一般规则,因为到目前为止我找不到它.谢谢.
我正在阅读《Hadoop:权威指南》,然后出现了以下段落。
磁盘具有块大小,这是它可以读取或写入的最小数据量。单个磁盘的文件系统通过处理块中的数据来构建,块是磁盘块大小的整数倍。文件系统块的大小通常为几千字节,而磁盘块的大小通常为 512 字节。
我的理解是磁盘块受硬件限制(每次可以从磁盘读取/写入的数据量)。操作系统创建称为文件系统的抽象,其中它有自己的块大小,该块大小比磁盘块大小大(多倍)。与磁盘类似,操作系统读/写数据的大小为文件系统块大小。对于单个读/写文件系统块,将执行多个磁盘块操作。我的理解正确吗?