是否可以使用NIO处理进程中的stdout?我有它使用java.io,但这是一个练习,以了解更多关于NIO和探索性能改进的可能性.
基本上我想尽可能快地将大量文本从stdout流式传输到缓冲区而不会阻塞,然后再处理该缓冲区的内容.麻烦的是,我似乎无法弄清楚正确的伏都教使其与NIO合作.这就是我现在所处的位置:
ProcessBuilder pb = new ProcessBuilder( ... );
Process p = pb.start();
stdout = new StreamConsumer(p.getInputStream());
new Thread(stdout).start();
// other stuff omitted for brevity
Run Code Online (Sandbox Code Playgroud)
StreamConsumer类看起来像这样:
class StreamConsumer implements Runnable
{
private InputStream is;
public StreamConsumer(InputStream is)
{
this.is = is;
}
public void run()
{
try
{
ReadableByteChannel source = Channels.newChannel(is);
// Is it possible get a channel to a ByteBuffer
// or MappedByteBuffer here?
WritableByteChannel destination = ??;
ByteBuffer buffer = ByteBuffer.allocateDirect(128 * 1024);
while (source.read(buffer) != -1) …Run Code Online (Sandbox Code Playgroud) 是否有一个像 IDE 一样的工具来编写和调试 PL/pgSQL 函数,例如用于编写存储过程?
我发现使用 pgAdmin III 是一种挫折练习,因为错误消息通常非常神秘,而且事情有以神秘方式失败的习惯。
我想从PNG中剥离Alpha通道(透明背景),然后将它们写为JPEG图像.更准确地说,我想将透明像素设为白色.我尝试了两种技术,两种技术都以不同的方式失败:
方法1:
BufferedImage rgbCopy = new BufferedImage(inputImage.getWidth(), inputImage.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = rgbCopy.createGraphics();
graphics.drawImage(inputImage, 0, 0, Color.WHITE, null);
graphics.dispose();
return rgbCopy;
Run Code Online (Sandbox Code Playgroud)
结果:图像具有粉红色背景.
方法2:
final WritableRaster raster = inputImage.getRaster();
final WritableRaster newRaster = raster.createWritableChild(0, 0, inputImage.getWidth(), inputImage.getHeight(), 0, 0, new int[]{0, 1, 2});
ColorModel newCM = new ComponentColorModel(inputImage.getColorModel().getColorSpace(), false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
return new BufferedImage(newCM, newRaster, false, null);
Run Code Online (Sandbox Code Playgroud)
结果:图像为黑色背景.
在这两种情况下,输入图像都是PNG,输出图像以JPEG格式写入,如下所示:ImageIO.write(bufferedImage, "jpg", buffer).如果它是相关的:这是在Java 8上,我使用12monkeys库来调整图像大小,然后再将其写为JPEG.
我已经尝试了上面代码的一些变体,没有运气.以前的一些问题提出了上述代码,但在这种情况下似乎并没有起作用.
任何人都可以指出我的参考或提供高级概述,如Facebook,雅虎,谷歌等公司如何执行他们为运营,特别是网络分析做的大规模(例如多TB范围)日志分析?
特别关注网络分析,我对两个密切相关的方面感兴趣:查询性能和数据存储.
我知道一般的方法是使用map reduce在集群上分发每个查询(例如使用Hadoop).但是,最有效的存储格式是什么?这是日志数据,因此我们可以假设每个事件都有一个时间戳,而且通常数据是结构化的而不是稀疏的.大多数Web分析查询涉及分析两个任意时间戳之间的数据片段,并检索该数据中的聚合统计信息或异常.
像Big Table(或HBase)这样的面向列的数据库是一种有效的存储方式,更重要的是,它可以查询这些数据吗?您选择行的子集(基于时间戳)这一事实是否违背了此类存储的基本前提?将它存储为非结构化数据会更好吗,例如.反向指数?
我正在使用一个 3rd 方 API,它为同一个 JSON 属性返回三种不同的类型,这取决于它包含多少嵌套对象。我正在尝试找出使用 Jackson(最好使用 Retrofit)处理反序列化这些对象的最佳方法。
一个简化的示例:从该 API 检索客户记录时,响应可能是以下任何一项:
客户有多个电话号码;返回一个数组PhoneObjects
{
"Phones": {
"PhoneObject":[
{"number":"800 555 6666","type":"Home"},
{"number":"800 555 4444","type":"Work"}
]
}
}
Run Code Online (Sandbox Code Playgroud)客户有一个电话号码;返回单个PhoneObject
{
"Phones": {
"PhoneObject": {"number":"800 555 6666","type":"Home"}
},
}
Run Code Online (Sandbox Code Playgroud)客户没有电话号码;返回一个空字符串(!)
{
"Phones": {
"PhoneObject":""
}
}
Run Code Online (Sandbox Code Playgroud)目前,我通过将 Jackson 反序列化为 aMap<String, Object>并检查Object以确定它是什么类型,然后将其插入到例如 a List<PhoneObject>(如果对象不存在,则返回空列表)来处理此问题。然而,这很麻烦,并且希望找到一种更简洁的方法来反序列化这些对象。
有没有办法用BufferedReader读取ByteBuffer而不必先将它变成String?我想通过相当大的ByteBuffer读取文本行,出于性能原因,我想避免将其写入磁盘.在ByteBuffer上调用toString不起作用,因为生成的String太大(它会抛出java.lang.OutOfMemoryError:Java堆空间).我原以为API中会有一些东西将ByteBuffer包装在合适的阅读器中,但我似乎找不到合适的东西.
这是一个缩写代码示例,说明了我在做什么):
// input stream is from Process getInputStream()
public String read(InputStream istream)
{
ReadableByteChannel source = Channels.newChannel(istream);
ByteArrayOutputStream ostream = new ByteArrayOutputStream(bufferSize);
WritableByteChannel destination = Channels.newChannel(ostream);
ByteBuffer buffer = ByteBuffer.allocateDirect(writeBufferSize);
while (source.read(buffer) != -1)
{
buffer.flip();
while (buffer.hasRemaining())
{
destination.write(buffer);
}
buffer.clear();
}
// this data can be up to 150 MB.. won't fit in a String.
result = ostream.toString();
source.close();
destination.close();
return result;
}
// after the process is run, we call this method with the String
public …Run Code Online (Sandbox Code Playgroud) java ×4
bytebuffer ×2
nio ×2
alpha ×1
bigtable ×1
hadoop ×1
inputstream ×1
jackson ×1
json ×1
mapreduce ×1
plpgsql ×1
postgresql ×1
retrofit ×1
storage ×1