- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题。我想创建一个基于 IR 系统的搜索引擎。所以,我有一些文件,我获取我需要的信息并将它们存储在 HashMaps、TreeMaps、ArrayLists 等结构中。然后,我想将这些信息写入文件。所以,我同时打开了 2 个 FileWriters。但是我在其中添加了越来越多的字符串。
但是这个过程耗时太长。我不知道为什么。当我将所有内容放入 FileWriter 时,我通过 close()
关闭它。
您是否认为问题出在每次我在缓冲区中添加新字符串时的重新分配?
我是否应该遵循另一种策略打开缓冲区,写入,关闭它,然后在下一次再次打开以在先前数据的末尾写入?这会花费更少的时间吗?
P.S.:对于一个小的输入文件,代码完全符合我的要求。问题是当我使用大量的输入文件时。
public static void writeWordsandDfInFile(Map<String, Word> tmpMap) throws IOException
{
Set tmpSet = tmpMap.entrySet();//Transform to Set for quick iteration and printing
Iterator tmpIt = tmpSet.iterator();
String le3h=null;
int bytesPostingFile;
int bytesVocabularyFile;
String str_out = null;
String prev_str_out = null;
String str_out2 = null;
String str_tmp;
String str_tmp2;
String Tstrt;
int prevctr=0;
int flag=0;
int i=0;
int j;
int k;
int flag2;
int flag3;
int docId;
//////////////////
int SIZEDocumentsFileBytes;
int prevInDocumentsFileBytes = 0;
int newInDocumentsFileBytes = 0;
int prwth_kataxwrhsh;
int ctrPostingFileBytes=0;
int prwthMonofora=0;
giveWrdTakeBytePos=new HashMap<String,Integer>();//8a t dinw thn le3h kai 8a mou epistrefei thn 8esh se bytes mesa sto VocabularyFile.txt
// Create file
FileWriter fstream = new FileWriter(vocabularyFile.getPath());
BufferedWriter out = new BufferedWriter(fstream);
out.
out.write("Le3h Df PosInPostingFile.txt\n\n");
str_tmp=("Le3h Df PosInPostingFile.txt\n\n");
// Create file
FileWriter fstream2 = new FileWriter(postingFile.getPath());
BufferedWriter out2 = new BufferedWriter(fstream2);
out2.write("DocId Tf LineInFile PosInDocumentsFile\n\n");
str_tmp2=("DocId Tf LineInFile PosInDocumentsFile\n\n");
PostingFileBytes=new ArrayList<Integer>();//krataw ta bytes gia kaue eggrafh sto PostingFile
flag=0;
i=0;
while(tmpIt.hasNext())
{
Map.Entry m = (Map.Entry) tmpIt.next();
le3h=(String)m.getKey();
Set s = tmpMap.get(le3h).getDocList().entrySet();
Iterator it = s.iterator();
Map.Entry mm =(Map.Entry)it.next();
docId=(Integer)mm.getKey();
Set ss=tmpMap.get(le3h).getDocList().keySet();
Set stf=tmpMap.get(le3h).getTf().keySet();
Iterator ssIt = ss.iterator();
flag2=0;
prwth_kataxwrhsh=0;
while(ssIt.hasNext())
{
docId=(Integer)ssIt.next();
out2.write(docId+" "+tmpMap.get(le3h).getTf(docId));//grafw sto VocabularyFile.txt thn ka8e le3h kai to Df ths
if(flag2==0)
{
str_out2=(docId+" "+tmpMap.get(le3h).getTf(docId));
flag2=1;
}
else
{
str_out2=(docId+" "+tmpMap.get(le3h).getTf(docId));
}
flag3=0;
Tstrt=null;
for(k=0;k<tmpMap.get(le3h).ByteList.get(docId).size();k++)
{
out2.write(" "+tmpMap.get(le3h).ByteList.get(docId).get(k));
if(flag3==0)
{
Tstrt=(" "+tmpMap.get(le3h).ByteList.get(docId).get(k));
flag3=1;
}
else
{
Tstrt=Tstrt+(" "+tmpMap.get(le3h).ByteList.get(docId).get(k));
}
}
str_out2=str_out2+Tstrt;
out2.write(" ->"+DocumentsFileBytes.get(docId)+"\n");
str_out2=str_out2+(" ->"+DocumentsFileBytes.get(docId)+"\n");
bytesPostingFile=str_out2.toString().length();
////////////////////////////////////////////////////////////////////////////////////////////////
//................................................................................................................................
SIZEDocumentsFileBytes=PostingFileBytes.size();
if(prwthMonofora==0)
{
prevInDocumentsFileBytes=str_tmp2.toString().length();
prwthMonofora=1;
PostingFileBytes.add(prevInDocumentsFileBytes);
ctrPostingFileBytes=0;//dld. parxei kataxwrish sthn 8esh 0 tou posting file
newInDocumentsFileBytes=prevInDocumentsFileBytes + bytesPostingFile;
//System.out.println("EPOMENH: "+newInDocumentsFileBytes);
}
else
{
if(prwth_kataxwrhsh==0)//gia ka8e le3h mono thn prwth fora kai as exei DF>1
{
//System.out.println("Prohg. Timh:"+prevInDocumentsFileBytes);
prevInDocumentsFileBytes=newInDocumentsFileBytes;//apo prin
//System.out.println("BAZW: "+prevInDocumentsFileBytes);
PostingFileBytes.add(prevInDocumentsFileBytes);
ctrPostingFileBytes++;
prwth_kataxwrhsh=1;
}
else
{
prevInDocumentsFileBytes=newInDocumentsFileBytes;
}
newInDocumentsFileBytes=prevInDocumentsFileBytes + bytesPostingFile;
//System.out.println("EPOMENH: "+newInDocumentsFileBytes);
}
}
//------------------------------------------------------------------------------------------------------------------
int ptr=ctrPostingFileBytes;
out.write(le3h+" "+tmpMap.get(le3h).getDf());//grafw sto VocabularyFile.txt thn ka8e le3h kai to Df ths
out.write(" ->"+PostingFileBytes.get(ptr)+"\n");
if(flag==0)//thn prwth fora
{
str_out=(le3h+" "+tmpMap.get(le3h).getDf()+" ->"+PostingFileBytes.get(ptr)+"\n");
giveWrdTakeBytePos.put(le3h, str_tmp.toString().length());
flag=1;
prev_str_out=str_tmp+str_out;
}
else
{
giveWrdTakeBytePos.put(le3h, prev_str_out.toString().length());
str_out=str_out+(le3h+" "+tmpMap.get(le3h).getDf()+" ->"+PostingFileBytes.get(ptr)+"\n");
prev_str_out=prev_str_out+(le3h+" "+tmpMap.get(le3h).getDf()+" ->"+PostingFileBytes.get(ptr)+"\n");
}
//................................................................................................................................
}
//Close the output stream
out.close();
//Close the output stream
out2.close();
}
最佳答案
据我所知,您从不追加到文件中,而是始终写入新文件。但是从你上面写的(没有阅读整个代码)你想要将数据附加到文件。
new FileWriter("path", true);
这对你有帮助吗?
另一个建议删除文件写入并使用它:
public static void foo()
{
// ...
byte[] fifeMBByteAryOne = new byte[5242880];
ByteArrayStream bStream = new ByteArrayStream(fifeMBByteAryOne);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(bStream));
byte[] fifeMBByteAryTwo = new byte[5242880];
ByteArrayStream bStream2 = new ByteArrayStream(fifeMBByteAryTwo);
BufferedWriter out2 = new BufferedWriter(new OutputStreamWriter(bStream2));
// ...
}
private static class ByteArrayStream extends OutputStream {
int index = 0;
byte[] container;
public ByteArrayStream(byte[] container) {
this.container = container;
}
@Override
public void write(int b) throws IOException {
container[index++] = (byte)b;
}
}
然后让它再次运行,看看需要多长时间。如果它和以前一样慢,则文件不是您的问题。
通读代码后,我相当确定您是 Java 编程的学生或初学者,这很好,但您应该在问题中说明这一点。它还会导致人们给你建议,而不是直接解决你的问题。
您可以改进很多事情。首先,从我的角度来看非常重要:您的编码风格需要改进。真的吗!有关于如何编写变量(以小写字母开头)方法等的标准。使用它们。您使用的变量比您需要的多得多,并且您在方法的开头定义了它们。在不需要时使用 Sets 和 Iterators(例如
Set s = currentWord.getDocList().entrySet();
Iterator it = s.iterator();
Map.Entry mm = (Map.Entry) it.next();
docId = (Integer) mm.getKey();
那么你永远不会使用 docId 的值,但是这里的这个 Action 当然需要时间。
重写该方法,这次了解您所做的事情,只做您需要的事情,当您需要它时,就像现在这样,我不允许我公司的任何人为客户使用它。
第二:当你将代码发布到互联网时,一定要发布直接编译的代码。我需要 15 分钟来编译该代码。周围很少有人有那么大的耐心。
第三:对于您编写的文本少于 2MB 的情况,使用 StringBuilder 构建整个文本并最终将其写成一个东西通常很有用。这使得调试更容易。
第四:在你把代码发到网上之前一定要自己想过问题并测试过解决问题。在这种情况下,您可以使用 Dates 来执行此操作,只需编写如下文本:
// at the beginning of a loop
long startedAt = new Date().getTime();
// somewhen within the loop:
System.out.println("in situation X " + (new Date().getTime()-startedAt);
这样您就可以看到哪个步骤需要多长时间,然后可以开始优化该区域。
第五:如果在第四之后仍然存在问题,请务必发布一小段代码,清楚地说明您的问题。不要依赖其他用户来理解您的问题,而是向他们展示。通过使用您所要求的语言的 self 解释变量、方法和类名,让他们更容易。您的评论也是如此。
第六:你应该做这一切的原因是让你有能力自己解决你的问题,并且只向具有扩展技能的人询问值得他们花时间的问题。
祝你好运
关于java - 添加 ArrayList<Integer> 耗时过长(超过 50000 个节点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8436840/
我有一个如下所示的数据框: import pandas as pd d = {'decil': ['1. decil','1. decil','2. decil','2. decil','3. dec
我有一些数据想要添加到我的应用中...大约 650 个类别(包括名称 + ID 号),每个类别平均有 85 个项目(每个都有一个名称/ID 号)。 iPhone会支持这么大的plist吗?我想首先在
我目前正在使用 Python 从头开始实现决策树算法。我在实现树的分支时遇到了麻烦。在当前的实现中,我没有使用深度参数。 发生的情况是,要么分支结束得太快(如果我使用标志来防止无限递归),要么如果
我在 Stack 上发现了这个问题 - Measuring the distance between two coordinates in PHP 这个答案在很多方面似乎对我来说都是完美的,但我遇到了
我目前正在清理一个具有 2 个索引和 2.5 亿个事件行以及大约同样多(或更多)的死行的表。我从我的客户端计算机(笔记本电脑)向我的服务器发出命令 VACCUM FULL ANALYZE。在过去的 3
这一切都有点模糊,因为该计划是相当深入的,但坚持我,因为我会尽量解释它。我编写了一个程序,它接受一个.csv文件,并将其转换为MySQL数据库的INSERT INTO语句。例如: ID Numbe
我有一个地址示例:0x003533,它是一个字符串,但要使用它,我需要它是一个 LONG,但我不知道该怎么做:有人有解决方案吗? s 字符串:“0x003533”到长 0x003533 ?? 最佳答案
请保持友善 - 这是我的第一个问题。 =P 基本上作为一个暑期项目,我一直在研究 wikipedia page 上的数据结构列表。并尝试实现它们。上学期我参加了 C++ 类(class),发现它非常有
简单的问题。想知道长 IN 子句是否是一种代码味道?我真的不知道如何证明它。除了我认为的那样,我不知道为什么它会闻起来。 select name, code, capital, pop
我正在尝试基于 C# 中的种子生成一个数字。唯一的问题是种子太大而不能成为 int32。有什么方法可以像种子一样使用 long 吗? 是的,种子必须很长。 最佳答案 这是我移植的 Java.Util.
我一直想知道这个问题有一段时间了。在 CouchDB 中,我们有一些相当的日志 ID……例如: “000ab56cb24aef9b817ac98d55695c6a” 现在,如果我们正在搜索此项目并浏览
列的虚拟列 c和一个给定的值 x等于 1如果 c==x和 0 其他。通常,通过为列创建虚拟对象 c , 一排除一个值 x选择,因为最后一个虚拟列不添加任何信息 w.r.t.已经存在的虚拟列。 这是我如
使用 tarantool,为什么我要记录这些奇怪的消息: 2016-03-24 16:19:58.987 [5803] main/493623/http/XXX.XXX.XXX.XXX:57295 t
我显然是 GitHub 的新手,想确保在开始之前我做的事情是正确的。 我想创建一个新的存储库,它使用来自 2 个现有项目的复刻/克隆。现有项目不是我的。 假设我想使用的 repo 被称为来自开发人员“
我的应用程序名称长度为 17 个字符。当安装在设备上时,它看起来像应用程序...名称。有没有办法在多行上显示应用程序名称?请帮忙。 最佳答案 不,你不能。我认为 iPad 支持 15 个字符来完整显示
我必须编写一个程序来读取文件中的所有单词,并确定每个单词使用了多少次。我的任务是使用多线程来加快运行时间,但是单线程程序的运行速度比多线程程序快。我曾尝试研究此问题的解决方案,但很多解释只会让我更加困
假设我在给定的范围内有一个位置pos,这样: 0 = newRange*newRange : "Case not supported yet"; // Never happens in my code
我试图在 Java 中将 unix 时间四舍五入到该月的第一天,但没有成功。示例: 1314057600 (Tue, 23 Aug 2011 00:00:00 GMT) 至 1312156800
我们的项目有在 CVS 中从现有分支创建新分支的历史。几年后,这导致了每次发布时更改的文件上的这种情况: 新版本:1.145.4.11.2.20.2.6.2.20.2.1.2.11.2.3.2.4.4
我有以下数据框: DAYS7 <- c('Monday','Tuesday','Wednesday','Thursday','Friday', 'Saturday', 'Sunday') DAYS
我是一名优秀的程序员,十分优秀!