- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的要求是向文件系统中写入一个永不结束的传入可变大小二进制消息流。平均大小为2KB的邮件每秒到达1000条。因此,一小时内,消息总数将为3600*1000*2=6.8GB。
这些消息的主要目的如下
一。存档以备审计
2。提供搜索界面
我的问题是
有没有一个开源软件可以解决这个问题
如果进程以块大小的倍数写入,而进程在写入块的过程中崩溃,会发生什么样的错误
如果应用程序已写入块大小,但文件系统尚未将数据刷新到磁盘,则会发生什么类型的错误。
索引节点在任何情况下都会损坏吗
linux中有文件大小限制吗?
有理想的文件大小吗?大文件(GB)和中文件(MB)的优缺点是什么
还有什么要注意的吗?
我的首选是使用C++,但是如果需要,我可以切换到C。
最佳答案
一旦write
或writev
返回(即操作系统已接受),操作系统就负责将数据写入磁盘。这不再是你的问题了,而且它的发生完全没有考虑到你的流程崩溃。请注意,您无法控制一次接受或实际写入的确切数据量,也无法控制它是否以文件系统块的倍数出现,也无法控制它是否有任何特定的大小。您向write
发送一个请求,它告诉您它实际接受了多少,它将根据自己的判断将该请求写入磁盘。
这可能会以块大小的倍数发生,因为这对操作系统来说是有意义的,但这并不能以任何方式得到保证(在许多系统中,包括Linux,读写是通过文件映射实现的,或者与文件映射紧密耦合)。
同样的“不必担心”保证了文件映射的有效性(除了理论上的例外,崩溃的应用程序原则上仍然可以写入到一个仍然映射的区域,但是一旦你取消了一个区域的映射,即使理论上也不可能发生这种情况)。除非拔掉插头(或者内核崩溃),否则数据将被写入并保持一致。
数据只会以文件系统块的倍数写入,因为内存页是设备块的倍数,而文件映射不知道其他任何东西,它就是这样工作的。
您可以(忽略任何可能的无缓冲磁盘写缓存)使用fdatasync
来控制磁盘上的内容。当该函数返回时,以前在缓冲区中的内容已发送到磁盘。
但是,这仍然不能防止进程在同一时间崩溃到另一个线程中,也不能防止有人拔出插头。fdatasync
比fsync
更受欢迎,因为它不接触索引节点附近的任何东西,这意味着它更快、更安全(由于长度尚未更新,您可能会丢失在后续崩溃中写入的最后一个数据,但您永远不应破坏/损坏整个文件)。
C库函数(fwrite
)执行它们自己的缓冲,并让您控制您写入的数据量,但是“写入”数据只意味着它存储在C库(在您的进程中)拥有的缓冲区中。如果进程结束,数据就会消失。无法控制数据是如何到达磁盘的,或者如果有。(注意:在您可以fflush
的范围内,您确实有一些控件,这将在返回之前立即将缓冲区的内容传递给底层写函数,很可能是writev
。说完,你又回到了第一段。)
异步IO(kernel aio)将绕过内核缓冲区,通常直接从进程中提取数据。你的进程结束了,你的数据消失了。Glibc aio使用阻塞write
的线程,与第1段中的相同。
如果你随时拔掉插头或按下“关”开关会发生什么?没人知道。
通常一些数据会丢失,一个操作系统可以给很多保证,但它不能起到神奇的作用。尽管在理论上,您可能有一个用电池缓冲RAM的系统,或者有一个用电池供电的巨大专用磁盘缓存的系统。没人知道。无论如何,计划丢失数据。
也就是说,如果你一直在一个文件中追加内容,那么一旦写入的内容通常不会被破坏(尽管,实际上任何事情都可能发生,“不应该”并不意味着什么)。
总之,在追加模式或文件映射中使用write
应该已经足够好了,不管怎样,它们都已经足够好了。除了突然断电,它们是可靠和有效的。
如果停电是个问题,UPS将提供比任何软件解决方案都能提供的更好的保证。
至于文件大小,我认为没有任何理由人为地限制文件大小(假设有一个相当新的文件系统)。“标准”Linux文件系统的通常文件大小限制(如果有的话)在TB范围内。
不管怎样,如果你对一个文件因任何原因损坏可能会破坏30天的数据的想法感到不安,那么每天创建一个新文件。不需要额外的费用。
关于linux - 在Linux中可靠写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10203521/
我正在尝试运行以下内容:: Press to see code - name: Snapshot BI nodes hosts: [CLUSTER-BI,CLUSTER-BI-REPL
在这里尝试心理重置:我尝试使用 MSMQ 创建一个可靠、持久的堆栈,但没有成功 所以更一般地说: 我有生产者(一个 web 服务,虽然“只有一个”,但也是多线程的)/消费者(多个进程,根据需要设置)。
试图为分布式系统找到一个商业日志框架。此框架必须允许远程服务器上的 .NET 应用程序记录可以在中央位置收集的消息。如果可能,中央位置应将消息存储在 SQL Server 数据库中。 要求: 能够在远
我正在开发 Restful 服务,我们将在数据库中插入/更新新记录。 由于REST使用HTTP进行通信,而HTTP并不可靠,我担心如果连接失败,请求可能无法发送到服务器。 我在 link 中找到的建议
我正在尝试实现一个页面,员工可以在其中登录并添加、修改、更新工作案例。 我有一个选择列表,其中包含从数据库加载的数据(员工姓名)。在这个数据库中,我有基本信息、用户名、ID、密码、电子邮件。 选择列表
我在 C 代码和 Python 代码之间(偶尔)得到略有不同的计算结果,并设法找到了一个例子。在 Python 中,我得到了这个: >>> print "%.55f" %\ ... (-2.49999
例如如果我将计时器设置为每天午夜到期,如果一个“失火”(例如,由于服务器关闭而不会触发回调)会发生什么?我在文档中找不到它。 有没有办法让这个定时器在服务器重启时立即触发回调? PS:我了解 Quar
我有一组不同长度的非零序列,我正在使用 Keras LSTM 对这些序列建模。我使用 Keras Tokenizer 进行分词(分词从 1 开始)。为了使序列具有相同的长度,我使用了填充。 填充示例:
我遇到了一个非常有趣的可靠 session 行为。我正在使用 netTcp 绑定(bind) + 双工 channel + 可靠 session 。 当我尝试在 channel.faulted 上收听
问题: 给定表 table_a 和 table_b,每当 table_a 更新时,我都需要可靠地(并发地)执行这样的操作: SELECT table_a 中的一些行。 在应用程序代码中计算一些内容。
我们目前的设计 环境 Redis 2.8.17 我们已经实现了我们的可靠队列,使用类似于 redis 文档中描述的模式的模式,在 RPOPLPUSH 下 但是,考虑到其阻塞性质,我们正在使用 BRPO
在我们的 WCF 应用程序中,我正在尝试配置可靠的 session 。 服务: 客户:
我使用这个 Delphi 7 代码来检测 Internet Explorer 是否正在运行: function IERunning: Boolean; begin Result := FindWi
我正在准备构建一个应用程序,该应用程序能够向 GPS 设备发送/接收航路点。通过一些谷歌搜索,我发现了很多可能对此目的有用的库: Java Chaeron GPS GPSLib4J Python Py
我有几个关于 WCF 可靠 session 可靠性的问题: WCF 是否在重试期间重新序列化消息? 2。如果 1 是正确的 - 它是否在消息参数被处理后发生? 3. 如果 2 是正确的 - 是否有任何
对于使用 $(this)[0].defaultValue 来确定文本框值是否已从原始值发生变化的一些反馈,我将不胜感激,例如 //keyUp event if($(this)[0].defaultVa
我正在开发一个具有以下特征的实时应用程序: 数百个客户端将同时插入行/文档,每个客户端每隔几秒插入一行。 大部分仅追加;几乎所有的行/文档,一旦插入,就永远不会改变。 只有当数据刷新到磁盘时,客户端才
场景:最终用户(不受信任的)提供了一个字符串,例如 "Hello, {name}!" .在服务器上,我想以 my_string.format(name="Homer") 的形式对该用户提供的字符串进行
我在推送通知方面遇到一些问题。我们使用 Firebase 来推送通知。问题是我可以在一台 iPhone 上正确接收 PushNotifications,但无法在另一台 iPhone 上接收它们。我在
从 python 到 c++,这是我能得到的最接近 python 的装饰器。 这个解决方案感觉有点像 hack,因为在要装饰的函数之后运行的代码在 Timer 析构函数中是隐式调用的。不过它确实有效。
我是一名优秀的程序员,十分优秀!