好吧,这可能不是最明智的想法,但如果可能,我有点好奇.说我有两个清单:
list1 = [3,2,4,1, 1]
list2 = [three, two, four, one, one2]
Run Code Online (Sandbox Code Playgroud)
如果我运行list1.sort(),它会对它进行排序,[1,1,2,3,4]但有没有办法让list2保持同步(所以我可以说第4项属于'3')?我的问题是我有一个非常复杂的程序,可以正常使用列表,但我需要开始引用一些数据.我知道这对于词典来说是一个完美的情况,但我正在努力避免在我的处理中使用字典,因为我确实需要对键值进行排序(如果我必须使用字典,我知道如何使用它们).
基本上这个程序的本质是,数据以随机顺序出现(如上所述),我需要对其进行排序,处理然后发送结果(顺序无关紧要,但用户需要知道哪个结果属于哪个键).我想先将它放在字典中,然后对列表进行排序,但如果不维护订单,我就无法区分具有相同值的项目(在将结果传达给用户时可能会产生影响).理想情况下,一旦我得到列表,我宁愿想出一种方法来将两个列表排序在一起.这可能吗?
我还在学习Java的绳索,如果对此有明显的答案,那就很抱歉.我有一个占用大量内存的程序,我想找到一种方法来减少它的使用,但在阅读了很多SO问题后,我认为我需要在开始优化之前证明问题出在哪里.
所以这就是我所做的,我在程序开始时添加了一个断点并运行它,然后我启动了visualVM并让它描述了内存(我也在netbeans中做同样的事情只是为了比较结果而且它们是相同的).我的问题是我不知道如何阅读它们,我得到的最高区域只是说char[],我看不到任何代码或任何东西(这是有道理的,因为visualvm连接到jvm并且看不到我的来源,但是netbeans也没有向我显示源代码,因为它在执行cpu profiling时也是如此.
基本上我想知道的是哪个变量(希望更多的细节,比如在哪种方法中)所有的内存都在使用,所以我可以专注于在那里工作.有一个简单的方法来做到这一点?我现在正在使用eclipse和java进行开发(并且专门为分析安装了visualVM和netbeans,但是我愿意安装其他任何你认为完成这项工作的东西).
编辑:理想情况下,我正在寻找将我的所有对象和大小排序的东西(所以我可以看到哪一个占用内存).目前它返回诸如string []或int []之类的通用信息,但我想知道它所指的是哪个对象,所以我可以努力使其大小更加优化.
我正在尝试将一些python代码转换为java,并需要设置列表的默认值.我知道默认值,列表的大小,我的目标是设置一个默认值,然后在我的程序中更改它们.在python中我只是这样做(创建10个值为零的项目):
list = [0]*10
Run Code Online (Sandbox Code Playgroud)
我想做:
List<Integer> list1 = Arrays.asList(0*10); // it just multiples 0 by 10.
Run Code Online (Sandbox Code Playgroud)
它做得很好,我知道我可以这样做:
for(int i = 0;i<10;i++)
{
list1.add(0);
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法(而不是for循环)?
我从队列服务器获取数据,我需要处理它并发送确认.像这样的东西:
while (true) {
queueserver.get.data
ThreadPoolExecutor //send data to thread
queueserver.acknowledgement
Run Code Online (Sandbox Code Playgroud)
我不完全理解线程中发生了什么,但我认为这个程序获取数据,发送线程然后立即确认它.所以即使我有一个每个队列的限制只能有200个未确认的项目,它只会拉到它可以接收它的速度.当我在单个服务器上编写程序时,这很好,但是如果我使用多个工作程序,那么这就成了一个问题,因为线程队列中的项目数量不是它完成的工作的反映,而是它的速度有多快可以从队列服务器获取项目.
如果线程队列充满工作,我能以某种方式使程序等待吗?
基本上我的消费者也是生产者.我们得到一个初始数据集,然后将其发送到队列.消费者接受物品并对其进行处理,从那时起有3种可能性:
我的问题在于第3步,因为队列起初非常快,可能会将一段数据分解为队列中重复的部分,并且消费者继续处理它并最终进入无限循环.
我认为防止这种情况的方法是防止重复进入队列.我不能在客户端做到这一点,因为在一个小时的过程中,我可能会有许多核心处理数十亿个数据点(让每个客户端在提交之前对其进行扫描会使我的速度减慢太多).我认为这需要在服务器端完成,但是,正如我所提到的,数据非常大,我不知道如何有效地确保没有重复.
我可能会问不可能,但我想我会试一试.任何想法将不胜感激.
SO社区是正确的,在你提出性能问题似乎比我随机猜测的方法更有意义之前分析你的代码:-)我描述了我的代码(非常密集的数学)并没有意识到超过70%的代码显然是在一个我没想到的部分是减速,四舍五入的来源.
static double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.###");
return Double.valueOf(twoDForm.format(d));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我得到的十进制数通常是.01,.02等.但有时我会得到像.070000000001(我真的只关心0.07,但浮点精度导致我的其他公式导致失败),我只需要前3个小数就可以避免这个问题.
那么有更好/更快的方法吗?
我对redis非常新,还在玩它.我想测试它是否与我的项目相关,但我不确定我正在运行的特定命令.SO上的用户让我确信使用管道和交易的性能优势所以我想我会问如何做到这一点.
基本上我有两个声明,我只想发布,而不必等待结果(似乎是管道衬里的一个很好的候选人.它看起来像这样:
Does valueX exist?
If it does insert valueY
Run Code Online (Sandbox Code Playgroud)
它非常简单,但到目前为止,我一直在研究它的所有方法似乎等待响应,如果ValueX存在,并且因为我正在做我的程序超过十亿次循环它研磨它停止.
这可能吗?如果它有助于我使用Java但尚未确定哪个客户端库(jedis或jredis,仍在测试).我实际上甚至没有完全确定redis,但是非常倾向于它(对于我正在做的速度看起来很好),所以任何建议都是可以接受的.
我在我的macbook上运行Jconsole并尝试连接到没有图形的ec2上的linux终端(只有命令行访问).
我像这样运行我的代码:
java -jar program.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9005
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.remote.ssl=false
Run Code Online (Sandbox Code Playgroud)
我在这里读到通过EC2访问时出现问题(连接后出现问题)并且解决方案似乎是' java.rmi.server.hostname to the public hostname of the instance'
我对如何做到这一点感到有点困惑.我尝试了两件事,一件是将它直接放在我的代码中(在void static main部分中):
System.setProperty( "java.rmi.server.hostname" , "external_EC2_address" ); //in my real code I have the correct address here
Run Code Online (Sandbox Code Playgroud)
系统接受了它(当我创建/上传runnable jar时没有错误).我还在我的实例上打开防火墙以允许所有TCP流量.没运气.我尝试上述声明也作为启动程序的标志,但仍然没有运气.
有什么想法怎么做?
更新:这将显示我在Java的绿色,我更进一步(仍然无法工作),但我意识到把java -jar filename.jar,然后选项没有给我与放我的相同的结果-jar在命令的末尾.我试过了,程序试图连接,然后说连接失败(之前它只是在登录界面说它).
我有一个程序可以生成大量数据并将其放入队列中进行写入,但问题是它生成的数据比我当前正在编写的更快(导致它达到最大内存并开始减速).订单无关紧要,因为我打算稍后解析文件.
我环顾了一下,发现了一些问题,帮助我设计了当前的过程(但我仍觉得它很慢).到目前为止,这是我的代码:
//...background multi-threaded process keeps building the queue..
FileWriter writer = new FileWriter("foo.txt",true);
BufferedWriter bufferWritter = new BufferedWriter(writer);
while(!queue_of_stuff_to_write.isEmpty()) {
String data = solutions.poll().data;
bufferWritter.newLine();
bufferWritter.write(data);
}
bufferWritter.close();
Run Code Online (Sandbox Code Playgroud)
我对编程很新,所以我可能会评估这个错误(可能是硬件问题,因为我正在使用EC2),但有一个非常快速地将队列结果转储到一个文件中,或者如果我的方法可以,我可以改进吗不知何故?由于顺序无关紧要,在多个驱动器上写入多个文件会更有意义吗?线程是否会让它更快?等等.我不确定最好的方法,任何建议都会很棒.我的目标是保存队列的结果(抱歉没有输出到/ dev/null :-)并保持我的应用程序尽可能低的内存消耗(我不是100%肯定但是队列填满了15gig,所以我我假设它将是一个15gig +文件).
在文本文件中编写大量数据的最快方法Java(实现我应该使用缓冲 编写器)在Windows上用Java编写并发文件(让我看到可能是多线程写入并不是一个好主意)
我过去使用过Collections.frequency并且工作正常但我现在遇到问题,因为我正在使用int [].
基本上Collections.frequency需要一个数组,但我的数据是int []的形式,所以我转换我的列表但没有得到结果.我认为我的错误在于转换列表但不确定如何做到这一点.
这是我的问题的一个例子:
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
public class stackexample {
public static void main(String[] args) {
int[] data = new int[] { 5,0, 0, 1};
int occurrences = Collections.frequency(Arrays.asList(data), 0);
System.out.println("occurrences of zero is " + occurrences); //shows 0 but answer should be 2
}
}
Run Code Online (Sandbox Code Playgroud)
我没有得到错误只是零,但当我尝试列出项目时Arrays.asList(data),我得到奇怪的数据,如果我只是直接添加数据,它想将我的列表转换为collections<?>
有什么建议?