是否有一种干净确定的火灾方式来检测ByteBuffer是否需要翻转?
我有一个ByteBuffer,用于打包和解包数据结构,也用于存储要打包/解包的字节.
但是,如果刚刚执行了写操作或执行了读操作,或者如果将ByteBuffer传递给我的代码,我无法保证缓冲区处于写模式或读模式而不需要手动操作位置和限制.
部分读取和写入也会增加此问题.我一直采用这样的惯例:缓冲区处于写入模式,并且创建副本并翻转以用于读取目的.当缓冲区传入我的代码时,会手动检查并设置位置和限制,因为它们处于写入模式.当然有更好的方法.
我正在探索帮助我的内存密集型应用程序的选项,在这样做时我遇到了Terracotta的BigMemory.从我收集的内容来看,它们利用了非垃圾收集的堆外"本机内存",显然由于序列化/反序列化问题,这比堆存储慢大约10倍.在阅读BigMemory之前,我从未听说过正常JNI之外的"本机记忆".尽管BigMemory是一个值得进一步考虑的有趣选项,但如果可以绕过序列化问题,我会对本机内存可以实现的内容感到好奇.
ByteBuffer当没有序列化问题时(例如,如果我将它与巨大的比较),Java本机内存是否比传统堆内存更快(我认为这需要对象?byte[])?或者做垃圾收集的变幻莫测等让这个问题无法回答?我知道"测量它"是一个常见的答案,但我担心我不会建立一个代表性的测试,因为我还不太了解本机内存在Java中是如何工作的.
什么是一个转换最快的方法java.nio.ByteBuffer a为(新建)CharBuffer b或char[] b.
通过这样做很重要a[i] == b[i].这意味着,不是a[i]和a[i+1]在一起构成一个价值b[j],getChar(i)做什么,但价值应该"扩散".
byte a[] = { 1,2,3, 125,126,127, -128,-127,-126 } // each a byte (which are signed)
char b[] = { 1,2,3, 125,126,127, 128, 129, 130 } // each a char (which are unsigned)
Run Code Online (Sandbox Code Playgroud)
注意,它byte:-128具有相同(低8位)的位char:128.因此,我假设"最佳"解释将如上所述,因为位是相同的.
之后我还需要相反的翻译:最有效的方式来获得char[] 或java.nio.CharBuffer重新进入java.nio.ByteBuffer.
我想使用java.nio.channels.FileChannel从文件中读取内容,但是我想像读取行一样BufferedReader#readLine()。我需要使用java.nio.channels.FileChannel而不是的java.io原因是,我需要在文件上放置一个锁,然后逐行读取该锁文件。所以我被迫使用java.nio.channels.FileChannel。请帮忙
编辑这是我的代码尝试使用FileInputStream获取FileChannel
public static void main(String[] args){
File file = new File("C:\\dev\\harry\\data.txt");
FileInputStream inputStream = null;
BufferedReader bufferedReader = null;
FileChannel channel = null;
FileLock lock = null;
try{
inputStream = new FileInputStream(file);
channel = inputStream.getChannel();
lock = channel.lock();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String data;
while((data = bufferedReader.readLine()) != null){
System.out.println(data);
}
}catch(IOException e){
e.printStackTrace();
}finally{
try {
lock.release();
channel.close();
if(bufferedReader != null) bufferedReader.close();
if(inputStream != null) inputStream.close(); …Run Code Online (Sandbox Code Playgroud) 我正在实现文件传输服务器,我遇到了通过网络发送大于2 GB的文件的问题.当我得到File我想要使用并尝试将其内容读入a 时,问题就开始了byte[].我有一个for循环:
for(long i = 0; i < fileToSend.length(); i += PACKET_SIZE){
fileBytes = getBytesFromFile(fileToSend, i);
Run Code Online (Sandbox Code Playgroud)
其中getBytesFromFile()读取一个PACKET_SIZE字节数fileToSend,然后在for循环中将其发送到客户端.getBytesFromFile()使用i作为偏移; 但是,偏移量变量FileInputStream.read()必须是int.我确定有更好的方法将这个文件读入数组,我还没有找到它.
我宁愿不使用NIO,虽然我将来会改用它.放纵我的疯狂:-)
考虑应用程序,它创建5-6个线程,循环中的每个线程为5mb页面大小分配MappedByteBuffer.
MappedByteBuffer b = ch.map(FileChannel.MapMode.READ_ONLY, r, 1024*1024*5);
Run Code Online (Sandbox Code Playgroud)
迟早,当应用程序使用大文件时,会抛出oom
java.io.IOException: Map failed at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:758)
Caused by: java.lang.OutOfMemoryError: Map failed
at sun.nio.ch.FileChannelImpl.map0(Native Method)
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:755)
Run Code Online (Sandbox Code Playgroud)
根据规范,MappedBuffer应该在GC本身时立即配置直接内存.看起来问题是,MappedBuffer-s的GC编辑太晚了,后来直接内存完成了.
如何避免这种情况?可能会说MappedBuffer隐式处理或使用某种MappedBuffer池
我正在使用"hadoop-0.20.203.0rc1.tar.gz"进行群集设置.每当我设定job.setMapOutputKeyClass(ByteBuffer.class);
并运行我得到以下异常的工作:
12/01/13 15:09:00 INFO mapred.JobClient: Task Id : attempt_201201131428_0005_m_000001_2, Status : FAILED
java.lang.ClassCastException: class java.nio.ByteBuffer
at java.lang.Class.asSubclass(Class.java:3018)
at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:776)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:958)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:755)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369)
at org.apache.hadoop.mapred.Child$4.run(Child.java:259)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
at org.apache.hadoop.mapred.Child.main(Child.java:253)
Run Code Online (Sandbox Code Playgroud)
另外我注意到ByteBuffer是Comparable而不是Writable是否会产生任何差异?如果需要任何其他信息,请与我们联系.
我正在使用Java 7和AsynchronousSocketChannel。我想读取一个请求(例如HTTP POST),但是如果它大于ByteBuffer我正在使用的大小,我正在努力想出一个很好的解决方案来读取完整的请求。例如,如果ByteBuffer是4048字节,并且HTTP POST包含大于4kB的图像。
有没有很好的递归解决方案或循环呢?
这是我的阅读请求代码:
public void readRequest(final AsynchronousSocketChannel ch) {
final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
final StringBuilder strBuilder = new StringBuilder();
final CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder();
ch.read(buffer, null, new CompletionHandler<Integer, Void>() {
public void completed(Integer bytes, Void att) {
buffer.flip();
try {
decoder.reset();
strBuilder.append(decoder.decode(buffer).toString());
} catch (CharacterCodingException e) {
e.printStackTrace();
}
buffer.clear();
// More data to read or send response
if(bytes != -1) {
// More data to read
ch.read(...); …Run Code Online (Sandbox Code Playgroud) 我真的遇到了麻烦:我想用FileChannels和MappedByteBuffers 读取几GB的HUGE文件- 我发现的所有文档都暗示使用该FileChannel.map()方法映射文件相当简单.当然,限制为2GB,因为所有Buffer方法都使用int来定位,限制和容量 - 但系统隐含的限制如何呢?
实际上,我遇到很多关于OutOfMemoryExceptions 的问题!并没有真正定义限制的文档!那么 - 如何将一个符合int-limit的文件安全地映射到一个或几个MappedByteBuffers而不仅仅是异常?
在尝试之前,我可以问系统我可以安全地映射文件的哪个部分FileChannel.map()?怎么样?为什么关于这个功能的文档很少?
我有一个标题和数据,我需要在一个表示Byte Array.我有一种特殊的格式用于打包标题Byte Array,也可以采用不同的格式打包数据Byte Array.在我拥有这两个之后,我需要做出最后一个Byte Array.
下面是布局,它是如何定义的C++,因此我必须做Java.
// below is my header offsets layout
// addressedCenter must be the first byte
static constexpr uint32_t addressedCenter = 0;
static constexpr uint32_t version = addressedCenter + 1;
static constexpr uint32_t numberOfRecords = version + 1;
static constexpr uint32_t bufferUsed = numberOfRecords + sizeof(uint32_t);
static constexpr uint32_t location = bufferUsed + sizeof(uint32_t);
static constexpr uint32_t locationFrom = location + sizeof(CustomerAddress);
static constexpr …Run Code Online (Sandbox Code Playgroud) bytebuffer ×10
java ×9
nio ×5
filechannel ×3
arrays ×2
asynchronous ×1
bytearray ×1
file-io ×1
hadoop ×1
io ×1
mapreduce ×1
memory ×1
networking ×1
terracotta ×1