我们从昂贵的实验中长时间(〜几天)获取类似文本/csv的数据,因此要不惜一切代价避免文件损坏。
最近,在进行实验时,从 XP 的资源管理器中复制了一个文件,并且部分数据丢失了,可能是由于多次访问冲突。
有什么好的技术可以避免这种损失?- 我们在 Windows XP 系统上使用 Delphi。
下面列出了我们提出的一些想法 - 我们欢迎您提出意见以及您自己的意见。
我们从昂贵的实验中长时间(〜几天)获取类似文本/csv的数据,因此要不惜一切代价避免文件损坏。
最近,在进行实验时,从 XP 的资源管理器中复制了一个文件,并且部分数据丢失了,可能是由于多次访问冲突。
有什么好的技术可以避免这种损失?- 我们在 Windows XP 系统上使用 Delphi。
下面列出了我们提出的一些想法 - 我们欢迎您提出意见以及您自己的意见。
使用数据库作为辅助数据存储机制并利用原子事务机制
如何将大文件拆分为单独的文件,每天一个。
如果这些机器在网络上:将带有日志记录数据的 HTTP 帖子发送到网络服务器。(发送 UDP 数据包会更简单)。
确保只复制旧数据。如果文件名上有一个分辨率为 1 小时的时间戳,则可以安全地复制早于 1 小时的数据。
如果写入失败,则缓存结果以供以后写入 - 因此,如果文件在外部打开,数据仍然存储在内部,甚至可以存储到磁盘
I think what you're looking for is the Win32 CreateFile API, with these flags:
FILE_FLAG_WRITE_THROUGH : Write operations will not go through any intermediate cache, they will go directly to disk.
FILE_FLAG_NO_BUFFERING : The file or device is being opened with no system caching for data reads and writes. This flag does not affect hard disk caching or memory mapped files. There are strict requirements for successfully working with files opened with CreateFile using the FILE_FLAG_NO_BUFFERING flag, for details see File Buffering.
每个实验都使用一个“工作”文件和一个“完成”文件。工作文件以独占方式打开,完成文件复制到网络上的某个地方。接收机器上的应用程序会将这些文件输入数据库。如果资源管理器尝试移动或复制工作文件,它将收到“拒绝访问”错误。
“工作”文件将在一段时间后“完成”(例如,6/12/24 小时或任何时间段)。所以它创建另一个工作文件(名称必须包含时间戳)并通过网络发送“完成”(或者人类可以这样做,如果我正确理解你的文本,你实际上在做什么)。
在使用时复制文件是要求它被损坏。
将数据写入隐藏目录中的缓冲区文件,并定期将数据复制到“公共”数据文件(例如每 10 个点),从而减少写入并提供备份
离散地写入数据点,即为每个数据点写入打开和关闭文件句柄 - 如果数据点之间的时间很短,这将减少访问文件的时间