首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从包含STL的文件中删除除最后500,000个字节之外的所有字节

从包含STL的文件中删除除最后500,000个字节之外的所有字节
EN

Stack Overflow用户
提问于 2008-12-05 16:19:50
回答 7查看 2.2K关注 0票数 1

我们的日志记录类在初始化时会将日志文件截断为500,000字节。从那时起,日志语句将被附加到文件中。

我们这样做是为了保持较低的磁盘使用率,我们是一种商品最终用户产品。

显然,保留前500,000个字节是没有用的,所以我们保留最后500,000个字节。

我们的解决方案存在一些严重的性能问题。执行此操作的有效方法是什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-12-06 04:28:34

“我可能会创建一个新文件,在旧文件中查找,从旧文件到新文件执行缓冲读/写,将新文件重命名为旧文件。”

我觉得你最好干脆:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <fstream>
std::ifstream ifs("logfile");  //One call to start it all. . .
ifs.seekg(-512000, std::ios_base::end);  // One call to find it. . .
char tmpBuffer[512000];
ifs.read(tmpBuffer, 512000);  //One call to read it all. . .
ifs.close();
std::ofstream ofs("logfile", ios::trunc);
ofs.write(tmpBuffer, 512000); //And to the FS bind it.

通过简单地将最后的512K复制到缓冲区,以截断模式打开日志文件(清除日志文件的内容),并将相同的512K返回到文件的开头,这就避免了文件重命名的问题。

注意,上面的代码还没有经过测试,但我认为这个想法应该是合理的。

您可以将512K加载到内存的缓冲区中,关闭输入流,然后打开输出流;通过这种方式,您将不需要两个文件,因为您已经输入、关闭、打开、输出512字节,然后执行。通过这种方式,您可以避免重命名/文件重定位魔术。

如果您在某种程度上不反对将C与C++混合使用,您也可以这样做:

(注意:伪代码;我根本不记得mmap调用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int myfd = open("mylog", O_RDONLY); // Grab a file descriptor
(char *) myptr = mmap(mylog, myfd, filesize - 512000) // mmap the last 512K
std::string mystr(myptr, 512000) // pull 512K from our mmap'd buffer and load it directly into the std::string
munmap(mylog, 512000); //Unmap the file
close(myfd); // Close the file descriptor

根据很多方面的情况,mmap可能比搜索更快。如果你感兴趣的话,可以在谷歌上搜索“fseek vs mmap”找到一些关于它的有趣读物。

HTH

票数 6
EN

Stack Overflow用户

发布于 2008-12-05 17:22:06

我可能会:

  • 创建新文件。
  • seek在旧文件中。
  • 执行从旧文件到新文件的缓冲读/写。
  • 将新文件重命名为旧文件。

要完成前三个步骤(省略了错误检查,例如,如果文件小于500k,我就不记得seekg做了什么):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <fstream>

std::ifstream ifs("logfile");
ifs.seekg(-500*1000, std::ios_base::end);
std::ofstream ofs("logfile.new");
ofs << ifs.rdbuf();

然后我认为你必须做一些非标准的事情来重命名文件。

显然,您需要500k的空闲磁盘空间才能正常工作,因此,如果您截断日志文件的原因是因为它刚刚填满了磁盘,那么这是不好的。

我不确定为什么搜索速度很慢,所以我可能遗漏了什么。我不期望查找时间取决于文件的大小。可能取决于文件的是,我不确定这些函数是否可以处理32位系统上的2GB+文件。

如果复制本身很慢,那么根据平台的不同,您可以通过使用更大的缓冲区来加快复制速度,因为这可以减少系统调用的次数,也许更重要的是减少了磁头在读取点和写入点之间必须查找的次数。为此,请执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int bufsize = 64*1024; // or whatever
std::vector<char> buf(bufsize);
...
ifs.rdbuf()->pubsetbuf(&buf[0], bufsize);

使用不同的值对其进行测试,并查看。您也可以尝试增加ofstream的缓冲区,我不确定这是否会有所不同。

请注意,在“实时”日志文件上使用我的方法是很麻烦的。例如,如果在副本和重命名之间附加了一个日志条目,那么您将永远丢失它,并且您试图替换的文件上的任何打开的句柄都可能导致问题(在Windows上它将失败,在linux上它将替换该文件,但旧的仍然会占用空间并且仍然会被写入,直到句柄关闭为止)。

如果截断是从执行所有日志记录的同一个线程完成的,那么就不会有任何问题,而且您可以保持简单。否则,您将需要使用锁或另一种方法。

这是否完全可靠取决于平台和文件系统:移动和替换可能是原子操作,也可能不是原子操作,但通常不是,因此您可能必须重命名旧文件,然后重命名新文件,然后删除旧文件,并进行错误恢复,在启动时检测是否有重命名的旧文件,如果有,则将其放回并重新启动截断。STL不能帮助您处理平台差异,但有boost::filesystem。

抱歉,这里有这么多警告,但很多都取决于平台。如果你使用的是PC,那么我不明白为什么复制一个微不足道的半兆数据需要花费任何时间。

票数 3
EN

Stack Overflow用户

发布于 2008-12-08 02:29:32

如果你碰巧用的是windows,那就别费心到处复制部件了。只需通过调用FSCTL_SET_SPARSEFSCTL_SET_ZERO_DATA来告诉Windows您不再需要第一个字节

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/345610

复制
相关文章
电子邮件伪造
电子邮件伪造是指发送者故意篡改邮件头部信息,以使邮件看起来似乎是来自另一个人或组织的行为。这种行为可能用于欺骗、诈骗、垃圾邮件发送等目的。以下是一些常见的电子邮件伪造技术。
zy010101
2024/05/25
3250
电子邮件伪造
邮件域名防止伪造的三种方式
在进行垃圾邮件投放时,经常会伪造知名平台的邮件来作为发送方,来提高用户对邮件的信任度,提高钓鱼邮件的成功率,但是作为知名公司,要尽量避免自家的域名成为黑客利用的目标,从而降低公司信誉,所以要对自家的域名进行加固,防止被恶意利用,造成不必要的损失。
信安之路
2024/03/26
3820
邮件域名防止伪造的三种方式
在Ubuntu上安装开源邮件服务器-iRedmail
运行自己的邮件服务器有很多好处。它允许您管理邮箱和附件的大小,运行每小时/每日电子邮件备份,查看邮件日志,并允许您自由使用任何可用的域名。缺点通常是安装所有必要部件的深入且有时复杂的过程。本指南使用简化的流程,即iRedMail安装脚本,并且应该让您在15分钟内启动并运行邮件服务器。
双愚
2018/08/29
8.1K0
在Ubuntu上安装开源邮件服务器-iRedmail
Gmail垃圾邮件过滤器文件分享
Gmail垃圾邮件过滤器文件。 A filter file for Gmail to auto-delete spams. 工作后,一直使用Gmail邮件托管工作邮箱,收到的反馈很多,其中垃圾邮件,SEO,推销等邮件亦很多。还好Gmail提供了强大了过滤功能。以下是自己整理的一些垃圾邮件过滤文件,现在分享以下,以后会不断更新。
技术小黑屋
2018/09/04
7310
邮箱安全第10期 | DMARC-识别并拦截钓鱼邮件
DMARC全称是Domain-based Message Authentication, Reporting and Conformance,他基于现有的DKIM和SPF两大主流电子邮件安全协议,由Mail Sender方(域名拥有者Domain Owner)在DNS里声明自己采用该协议。当Mail Receiver方(其MTA需支持DMARC协议)收到该域发送过来的邮件时,则进行DMARC校验,若校验失败还需发送一封report到指定URI(常是一个邮箱地址)。本期我们将重点介绍一下邮件认证安全的主角DM
安恒信息
2018/04/10
2.1K0
邮箱安全第10期 | DMARC-识别并拦截钓鱼邮件
在Debian 8上使用Postfix配置SPF和DKIM
SPF(发件人策略框架)是一种向邮件服务器标识允许哪些主机为给定域发送电子邮件的系统。设置SPF有助于防止您的电子邮件被归类为垃圾邮件。
番茄味
2018/09/11
5.1K0
自己发给自己的垃圾邮件
最近邮箱里总是收到一些莫名其妙的邮件,什么内容都有,腾讯的垃圾邮件过滤并没有生效,先看看腾讯定义的垃圾邮件是什么:
obaby
2023/02/22
1.4K0
CS学习笔记 | 25、邮件防御
Cobalt Strike 不是什么工作情况都能胜任的工具,因此就需要我们根据不同的情况去做一些辅助工作。
TeamsSix
2020/10/10
9760
企业邮件安全防护实践
邮件系统作为一种有效的内外部工作沟通平台,在企业内得到广泛使用。同时,广告邮件、垃圾邮件、钓鱼邮件等问题就成了企业邮件安全头号难题。所以我们的企业安全人员以往更多关注反垃圾邮件,向对数据保密,反钓鱼方向演进。
FB客服
2019/10/24
3.4K0
企业邮件安全防护实践
DMARC:企业邮件信息泄漏应对之道
以电子邮件为潜在媒介的欺诈行为正快速且肆虐地发展,这会导致企业电子邮件泄密(Business Email Compromise,简称BEC)。
FB客服
2021/03/09
1.4K0
DMARC:企业邮件信息泄漏应对之道
什么是DMARC?如何设置腾讯企业邮箱的DMARC呢?
DMARC,2012年1月30号由Paypal,Google,微软,雅虎等开发,相关内容有DMARC协议。
用户4432529
2019/09/04
3.6K0
基于支持向量机的电子邮件垃圾邮件分类。
ex6.m %% Machine Learning Online Class % Exercise 6 | Support Vector Machines % % Instructions % ------------ % % This file contains code that helps you get started on the % exercise. You will need to complete the following functions: % % gau
裴来凡
2022/05/28
5790
基于支持向量机的电子邮件垃圾邮件分类。
关于网络钓鱼的深入讨论
网络钓鱼相信大家都不会太陌生。近年来,随着人们网络安全意识的提升,网络钓鱼的手法也变得越来越高明。攻击者的社工经验愈加丰富,钓鱼技术也愈加的先进和新颖。作为企业,通过技术手段似乎在一定程度上能保护员工免受大型钓鱼攻击的威胁,但这并不是解决问题的根本,更关键的是员工安全意识的加强和培养。下面,我们的讨论也将围绕该话题展开。 网络钓鱼听起来很容易,但大规模的钓鱼活动策划并不简单。以下是成功运行内部钓鱼邮件的一些提示和技巧。 网络钓鱼需要什么? * 一个合理迫切的借口! 借口是攻击者用来诱导目标员工,以伪装的合法
FB客服
2018/03/22
9910
关于网络钓鱼的深入讨论
20个关于Postfix的面试题
答:Postfix 是一个开源的 MTA(邮件传送代理,英文名:Mail Transfer Agent),用于转发 email。相信很多人知道 Sendmail,而 Postfix 是它的替代品。默认端口是25。
星哥玩云
2022/07/03
6660
20个关于Postfix的面试题
一封伪造邮件引发的“探索”(涉及钓鱼邮件、SPF和DKIM等)
0x00. 引言 我用swaks 发送一封以我们公司CTO为显示发件人(腾讯企业邮箱)的伪造邮件给我的一个同事,邮件的内容就是让这位同事去CTO的办公司一趟,没想到这位同事真的去了,然后一脸懵逼的回来了。 恶作剧算是完了,但是这让我开始研究伪造邮件是为什么产生的,腾讯企业邮为什么没有拦截。 0x01. 关于伪造邮件的一些总结 1) 邮件服务商之间转发邮件是不需要认证的,也就是说MTA 到MTA之间转发邮件是不需要认证的,这是SMTP协议本身定义的。 所以协议钓鱼邮件就可以伪称来自某某MTA发送钓鱼邮件;
FB客服
2018/02/28
6.1K0
一封伪造邮件引发的“探索”(涉及钓鱼邮件、SPF和DKIM等)
邮箱安全第9期 | 利用协议认证手段解决邮件安全问题
之前我们介绍了利用商业产品解决方案解决邮箱安全问题,鉴于SMTP传统邮件的安全性不足,我们将为大家介绍利用SPF,DKIM,rDNS, DMARC等邮件协议认证的手段解决邮箱安全问题。本期分别为大家做一些简单的介绍。 1rDNS rDNS是什么? rDNS(Reverse DNS)指得是反向解析,就是把IP解析成域名。反向解析在邮件服务器应用中相当于对你的邮件服务器进行身份验证,这样的策略可以很好的减少垃圾邮件。 为什么需要做rDNS? 因为有些应用程序需要反向来认证对方,如SMTP,也就是为什么国外很多S
安恒信息
2018/04/10
2.5K0
邮箱安全第9期 | 利用协议认证手段解决邮件安全问题
Swaks伪造邮件发件人绕过SPF
设置正确的 SPF 记录可以提高邮件系统发送外域邮件的成功率,也可以一定程度上防止别人假冒你的域名发邮件。
黑白天安全
2020/07/23
7.1K0
Swaks伪造邮件发件人绕过SPF
2021年全球一半的电子邮件是垃圾邮件
根据卡巴斯基最新的垃圾邮件和网络钓鱼报告,到2021年,将近一半的发往收件箱的电子邮件被归类为垃圾邮件,其中俄罗斯才是罪魁祸首。
FB客服
2022/02/25
8630
2021年全球一半的电子邮件是垃圾邮件
使用Docker搭建poste,自建邮件服务器
自建邮件服务可以不受发件量限制,批量发件成本更低,但部署相对复杂,而且容易进垃圾箱。不过现在越来越多的服务商已经开发好了产品,支持一键部署等方式,极大降低了部署和使用难度。这次给各位小伙伴安利一款开源邮件服务poste.
星哥玩云
2022/08/13
7.2K0
使用Docker搭建poste,自建邮件服务器
如何避免成为垃圾邮件
邮件营销经常会碰到的一个问题就是:发出去的邮件被系统当做垃圾邮件,直接进了垃圾箱,下面一米软件就来教教大家如何避免成为垃圾邮件。
用户3736847
2019/03/21
2.9K1

相似问题

Python | librosa:如何通过添加更多的点来及时拉伸信号

165

如何通过移动顶点来倾斜图像?

20

Python,matplotlib,通过设置为属性的点来散布对象

121

如何通过在Python中交换节点来修复或更正BST?

10

如何通过Google Map API获取地理坐标?

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文