【问题标题】:Techniques for writing critical text data编写关键文本数据的技术
【发布时间】:2010-09-22 12:07:45
【问题描述】:

我们从昂贵的实验中长时间(〜几天)获取类似文本/csv 的数据,因此要不惜一切代价避免文件损坏。

最近,在进行实验时,从 XP 的资源管理器中复制了一个文件,并且数据部分丢失,可能是由于多路访问冲突。

有什么好的技术可以避免这种损失? - 我们在 Windows XP 系统上使用 Delphi。

下面列出了我们提出的一些想法 - 我们欢迎 cmets 以及您自己的意见。

【问题讨论】:

    标签: delphi windows-xp mission-critical


    【解决方案1】:

    使用数据库作为辅助数据存储机制并利用原子事务机制

    【讨论】:

    • 数据库将提供其他好处并可用于生成报告。
    • 引入对另一个复杂系统的依赖是一个非常糟糕的主意。实验处理计算机上不应安装具有不可预测的处理器和磁盘负载特性的软件。
    • Stephen 有一个正确的观点 - 我应该强调的一点是,这里的计算机不太可能有专业的“管理”它们,我不愿意实现数据库,因为它增加了一个全新的层. KISS 在这种环境下似乎有很大的分量……
    【解决方案2】:

    如何将大文件拆分为单独的文件,每天一个。

    【讨论】:

    • 拆分文件是个好主意,而且相对容易实现 - 谢谢!
    【解决方案3】:

    如果这些机器在网络上:将带有日志记录数据的 HTTP 帖子发送到网络服务器。 (发送 UDP 数据包会更简单)。

    确保只复制旧数据。如果文件名上有一个分辨率为 1 小时的时间戳,则可以安全地复制早于 1 小时的数据。

    【讨论】:

    • UDP 提供不可靠的服务,数据报可能会乱序到达、出现重复或丢失,恕不另行通知。 (维基百科)
    • 这不是问题。这是一个本地网络。对于您将遇到的问题(人们断开网络电缆或断开路由器的电源),HTTP 不会比 UDP 有所改进。
    【解决方案4】:

    如果写入失败,缓存结果以供以后写入 - 因此,如果文件在外部打开,数据仍然存储在内部,甚至可以存储到磁盘中

    【讨论】:

    • 如果长时间写入失败,那么如果计算机断电,就会丢失存储在内存中的数据。
    • @stukelly,这是真的,但是这些想法不是“非此即彼”,我设想实施多个想法以使系统更加健壮。
    【解决方案5】:

    我认为您正在寻找的是带有这些标志的 Win32 CreateFile API:

    FILE_FLAG_WRITE_THROUGH :写操作不会经过任何中间缓存,它们会直接进入磁盘。

    FILE_FLAG_NO_BUFFERING :文件或设备正在打开,没有系统缓存用于数据读取和写入。此标志不影响硬盘缓存或内存映射文件。 使用 FILE_FLAG_NO_BUFFERING 标志成功处理使用 CreateFile 打开的文件有严格的要求,有关详细信息,请参阅文件缓冲。

    【讨论】:

      【解决方案6】:

      每个实验都使用一个“工作”文件和一个“完成”文件。工作文件以独占方式打开,完成文件复制到网络上的某个地方。接收机器上的应用程序会将这些文件输入数据库。如果资源管理器尝试移动或复制工作文件,它将收到“拒绝访问”错误。

      “工作”文件将在一段时间后“完成”(例如,6/12/24 小时或任何时间段)。所以它创建另一个工作文件(名称必须包含时间戳)并通过网络发送“完成”(或者人类可以这样做,如果我正确理解你的文本,你实际上在做什么)。

      在使用时复制文件是要求它被损坏。

      【讨论】:

        【解决方案7】:

        将数据写入隐蔽目录中的缓冲区文件,并定期(例如每 10 个点)将数据复制到“公共”数据文件,从而减少写入并提供备份

        【讨论】:

        • 通过默默无闻的安全性很少是一件好事。如果公共文件非常大,您最终会花费大量时间将自己定位为对公共文件的新写入。
        【解决方案8】:

        离散地写入数据点,即为每个数据点写入打开和关闭文件句柄 - 如果数据点之间的时间很短,这会减少访问文件的时间

        【讨论】:

        • 您只是在缩小机会之窗,而不是消除它。每次追加时,您还必须处理寻找数据末尾的问题。
        • @tvanfosson:在文明系统上(XP可能不是一个例子),您可以打开文件进行追加,这样每次写入都会自动在文件末尾。
        猜你喜欢
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多