请问一个比较两个文件内容的问题。

yoshubom 2007-09-16 09:22:05
现在有两个文件,大小都比较大,文件每一行就是一个号码,大概每个文件有一亿多行,现在想编一个程序将两个文件的号码提取到一个新建的文件中并剔除重复的号码。请问有什么做法效率最高?
...全文
271 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gangjh 2007-09-18
  • 打赏
  • 举报
回复
unix下用sort與join是可以的.
這麼大的文件不知效率如何

cceczjxy 2007-09-18
  • 打赏
  • 举报
回复
在unix下,用short分别现对两个文件排序.再用2路归并合成一个文件.合并过程中剔除相同的数据.
gangjh 2007-09-18
  • 打赏
  • 举报
回复
文件排序那一部份, 為了避免頻繁的數據移動.
我這樣做過.
1. 先用mmap到內存,windows下用 CreateFileMapping , MapViewOfFile
2. 再构造一指針數組,存放行在內存中的開始地址與長度.
3. 然後用qsort,得到順序數據.
4. 最後根據指針數組將數據另存文件.

gangjh 2007-09-18
  • 打赏
  • 举报
回复

大文件有可能整個內存都放不下,
解決方法如下,
先拆分文件, 再排序,然後合並.

合並時刪除重復數據.

需要優化的是歸並排序那一部份
nickshen_qidian 2007-09-17
  • 打赏
  • 举报
回复
用excel试试
FingerStyle 2007-09-17
  • 打赏
  • 举报
回复
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
using namespace std;
int main()
{
set<string> setStr;
ifstream inf1("1.txt");
ifstream inf2("2.txt");
ofstream outf("3.txt");
string str;
while (getline(inf1, str))
{
setStr.insert(str);
}
while (getline(inf2, str))
{
setStr.insert(str);
}

for (set<string>::iterator iter = setStr.begin();
iter != setStr.end();
iter ++)
{
outf << (*iter) << '\n';
}
}
  • 打赏
  • 举报
回复
记得有一本书上第一个讲到的问题这个问题.

如果内存足够大的话,全部读取到内存,然后排序移除相同元素.
也可以,分批读取,每一部分排序,移除相同元素,然后合并排序.比较麻烦了点.
FingerStyle 2007-09-17
  • 打赏
  • 举报
回复
set<string> setStr;
setStr.Insert(..);

楼主死机别找我啊 -_-b...
sxlengwa 2007-09-17
  • 打赏
  • 举报
回复
敢问 lz 号码都是多少位的?
redlives 2007-09-17
  • 打赏
  • 举报
回复
把一个文件中的数据不重复的存到一个数据结构中??

昏,1亿行,就算1亿个int型的也要近100M。

如果同一文件的数据不重复还好点,否则就麻烦了。
xugang_2001 2007-09-17
  • 打赏
  • 举报
回复
思路:

读写文件的时候开销很大,所以在读取文件数据的时候要设置一个数据缓冲区,把一个文件中的数据不重复的存到一个数据结构中,再去读取另外一个文件中的号码,逐个比对,算法的话似乎也没有什么好的方法,反正每个数据都要比对一次。
whw123456 2007-09-17
  • 打赏
  • 举报
回复
沙发~

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧