>我正在尝试使用链表来存储一个大文件的每一行(从 1 GB 到 70 GB(,但这就是问题所在,我不能,因为它溢出了我的 RAM 并迫使窗口停止程序执行。
我写的函数是这样的:
struct Word {
char word[13];
};
typedef struct Nodo {
struct Word word;
struct Nodo *next;
} TNodo;
typedef TNodo *Nodo;
void NewWord(Nodo *p, struct Word s) {
Nodo temp;
temp = (Nodo)malloc(sizeof(TNodo));
temp->word = s;
temp->next = *p;
*p = temp;
}
void LoadList(Nodo *p) {
FILE *f;
struct Word s;
char *buffer = malloc(sizeof(struct Word));
if (!(f= fopen("wordlist.txt", "r"))) {
fclose(f);
exit(1);
}
while (fgets(buffer, sizeof(struct Word), f)) {
if (sscanf(buffer,"%s", s.word) == 1) {
NewWord(p, s);
}
}
fclose(f);
free(buffer);
}
有没有更好的方法来处理非常大的文本文件中的数据(如删除文件行(而不存储它们?
我尝试读取的文本文件具有以下简单结构:
Word
Worf
Worg
据我所知,我发现以下两种方法比其他方法更好:
1( 将较大的块读入大型内存缓冲区,然后从该缓冲区中解析出数据。
2(另一种方法可能是代替内存映射文件,然后操作系统会将文件放入进程虚拟内存映射中,这样您就可以像从内存中读取一样读取它。
我根据您的答案更改了函数,现在函数NewWord只是将单词打印到第二个文件中,根据step1()
和step2()
功能跳过不必要的单词。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 67
char letters[SIZE] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'.','_','1','2','3','4','5','6','7','8','9','0','!','@','$'};
struct Word
{
char word[13];
};
_Bool step1(char * word)
{
for(int i = 0; i < SIZE; i++)
{
for(int j = 0, c = 0; j < strlen(word); j++)
{
if(word[j] == letters[i])
{
c++;
if(c > 3)
{
return 1;
}
}
}
}
return 0;
}
_Bool step2(char * word)
{
for(int i = 0; i < SIZE; i++)
{
for(int j = 0; j < strlen(word); j++)
{
if(word[j] == letters[i] && word[j+1] == letters[i] && word[j+2] == letters[i])
{
return 1;
}
}
}
return 0;
}
void NewWord(FILE *f, struct Word s)
{
if(step1(s.word ) == 1 || step2(s.word) == 1)
return;
fprintf(f, "%sn", s.word);
}
void LoadList()
{
FILE * f1;
FILE * f2;
struct Word s;
char * buffer = malloc(sizeof(struct Word));
if(!(f1= fopen("wordlist.txt", "r")))
{
fclose(f1);
exit(1);
}
if(!(f2 = fopen("bb.txt", "w")))
{
fclose(f2);
exit(1);
}
while(fgets(buffer, sizeof(struct Word), f1))
{
if(sscanf(buffer,"%s", s.word) == 1)
{
NewWord(f2, s);
}
}
fclose(f1);
fclose(f2);
free(buffer);
}
int main()
{
LoadList();
exit(0);
}