我想问一个问题,然后用我自己的答案跟进,但也看看其他人有什么答案.
我们有两个大文件,我们想同时从两个独立的线程中读取.一个线程将顺序读取fileA,而另一个线程将顺序读取fileB.线程之间没有锁定或通信,两者都按顺序读取,并且两者都立即丢弃它们读取的数据.
我们在Windows上使用此设置的经验非常差.两个线程的组合吞吐量大约为2-3 MiB/sec.驱动器似乎花费大部分时间在两个文件之间寻找后退和前进,大概在每次搜索后读取很少.
如果我们禁用其中一个线程并暂时查看单个线程的性能,那么我们可以获得更好的带宽(此机器约为45 MiB /秒).很明显,糟糕的双线程性能是操作系统磁盘调度程序的假象.
我们可以做些什么来改善并发线程读取性能? 也许通过使用不同的API或以某种方式调整操作系统磁盘调度程序参数.
一些细节:
在具有2GiB RAM的机器上,文件大小为2 GiB.出于这个问题的目的,我们认为它们不会被缓存并完美地进行碎片整理.我们使用了碎片整理工具并重新启动以确保这种情况.
我们没有使用特殊的API来读取这些文件.这种行为可以在各种沼泽标准API中重复,例如Win32的CreateFile,C的fopen,C++的std :: ifstream,Java的FileInputStream等.
每个线程在一个循环中旋转,调用read函数.我们改变了每次迭代从API请求的字节数,从1KiB到128MiB之间的值.改变这一点没有任何影响,因此在每次磁盘搜索之后,OS实际读取的数量不是由这个数字决定的.这正是应该期待的.
单线程和双线程性能之间的巨大差异在Windows 2000,Windows XP(32位和64位),Windows Server 2003以及使用和不使用硬件RAID5时都是可重复的.
我需要在文件中存储一些简单的属性并从Ruby访问它们.
我非常喜欢.properties文件格式,它是Java中这类东西的标准(使用java.util.Properties类)......它简单易用,易于阅读.
那么,是否有一个Ruby类可以让我从这样的文件中加载一些键值对而不需要花费太多精力?
我不想使用XML,所以请不要建议REXML(我的目的不保证"尖括号税").
我考虑过滚动我自己的解决方案......它可能是大约5到10行的代码顶部,但我仍然宁愿使用现有的库(如果它本质上是从文件构建的散列)......就像那样把它降到一线......
更新:它实际上是一个直接的Ruby应用程序,而不是rails,但我认为YAML会做得很好(它在我的脑海里,但我已经忘记了它......已经看过但从未使用过),谢谢大家!
我目前BufferedReader在同一文本文件上初始化了2 秒.当我用第一个文本文件读完文本文件时BufferedReader,我使用第二个文本文件从顶部再次传递文件.需要多次通过同一个文件.
我知道reset(),但它需要先调用,mark()并mark()需要知道文件的大小,我不认为我应该打扰.
想法?包?库?码?
谢谢TJ
具体来说,我正在尝试为一个方法创建单元测试,该方法需要用于File.separatorChar在windows和unix上构建路径.代码必须在两个平台上运行,但当我尝试更改此静态最终字段时,我会收到JUnit错误.
任何人都知道发生了什么事吗?
Field field = java.io.File.class.getDeclaredField( "separatorChar" );
field.setAccessible(true);
field.setChar(java.io.File.class,'/');
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我明白了
IllegalAccessException: Can not set static final char field java.io.File.separatorChar to java.lang.Character
Run Code Online (Sandbox Code Playgroud)
思考?
我是测试自动化的实习生.我正在使用Eclipse创建Junit代码并使用Eclipse运行.我正在使用FileInputStream函数从excel表中重新获取数据.
FileInputStream fi=new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);
Run Code Online (Sandbox Code Playgroud)
是否有必要关闭Inputstream功能?如果是这样,请指导我一些编码.
下面是两个将50,000,000字节写入文件的程序.
第一个用C语言编写的程序利用一个缓冲区,一旦填充到任意值,写入磁盘,然后重复该过程直到写入所有50,000,000个字节.我注意到,当我增加缓冲区的大小时,程序运行时间更短.例如,在BUFFER_SIZE = 1时,程序花了大约88.0463秒,而在BUFFER_SIZE = 1024时,程序只需要大约1.7773秒.我记录的最佳时间是BUFFER_SIZE = 131072.当BUFFER_SIZE增加高于此值时,我注意到它开始实际需要更长时间.
第二个用C++编写的程序利用ofstream一次写入一个字节.令我惊讶的是,该程序只用了1.87秒就可以运行了.我预计它需要一分钟左右,就像使用BUFFER_SIZE = 1的C程序一样.显然,C++ ofstream处理文件写入的方式与我想象的不同.根据我的数据,它的表现与BUFFER_SIZE = 512的C文件非常相似.它是否使用某种幕后缓冲区?
这是C程序:
const int NVALUES = 50000000; //#values written to the file
const char FILENAME[] = "/tmp/myfile";
const int BUFFER_SIZE = 8192; //# bytes to fill in buffer before writing
main()
{
int fd; //File descriptor associated with output file
int i;
char writeval = '\0';
char buffer[BUFFER_SIZE];
//Open file for writing and associate it with the file descriptor
//Create file if it does not exist; if …Run Code Online (Sandbox Code Playgroud) 我正在从文本文件中读取整数,将它们作为查询的输入并获取查询输出并写入xls文件.
ResultSet rs;
Connection con = null;
PreparedStatement ps = null;
int person_org_id, external_person_org_id;
File f = null;
Scanner scan = null;
try {
System.out.println("----------checkpoint-----------");
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("----------checkpoint 1-----------");
con = DriverManager.getConnection("jdbc:oracle:thin:@ksdjf.kjdlk.jkd.com:2222:edb", "aaaaa", "aaaa");
System.out.println("----------checkpoint 2 ----------");
if (con == null) {
System.out.println("unable to connect to database");
}
System.out.println("----------checkpoint 3::connected to database---------");
StringBuffer sql = new StringBuffer();
sql.append("select abd from edb.abd where customer_id=510 and person_org_id =? ");
ps = con.prepareStatement(sql.toString());
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Excel Sheet");
HSSFRow …Run Code Online (Sandbox Code Playgroud) 我试图在应用程序启动时加载和读取设置文件,大约90%的时间,await GetFileAsync("filename.xml");永远不会返回,因此,挂起应用程序.
大约四分之一的时间,如果我单步执行代码,它实际上将返回并读取文件.
这是代码的一个非常简化的版本:
App.xaml.cs:
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
FileLoader.Load().Wait();
// File-load dependent stuff
}
Run Code Online (Sandbox Code Playgroud)
FileLoader.cs:
public async static Task Load()
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file;
bool fileExists = true;
try
{
// The following line (often) never returns
file = await folder.GetFileAsync("filename.xml");
{
catch
{
fileExists = false;
}
// Do stuff with loaded file
}
Run Code Online (Sandbox Code Playgroud)
如果我在Visual Studio中观看"输出"窗口,经过一段时间的等待,我得到了 "The thread '<No Name>' (0x30c) has exited with code 0 (0x0)."
有没有人知道这里发生了什么?
我在使用utf-8编码读取文本文件时遇到问题我正在使用带有netbeans 7.2.1平台的java
我已经配置了java项目来处理UTF-8 javaproject ==>右键单击==> properties ==> source ==> UTF-8
但仍然得到未知的字符输出:
代码:
File fileDirs = new File("C:\\file.txt");
BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream(fileDirs), "UTF-8"));
String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
谢谢
我使用此代码删除所有文件:
File root = new File("root path");
File[] Files = root.listFiles();
if(Files != null) {
int j;
for(j = 0; j < Files.length; j++) {
System.out.println(Files[j].getAbsolutePath());
System.out.println(Files[j].delete());
}
}
Run Code Online (Sandbox Code Playgroud)
它将删除false Files[j]文件夹的位置.
我想删除文件夹及其所有子文件.
我怎么修改这个?
file-io ×10
java ×6
file ×2
android ×1
async-await ×1
c# ×1
c++ ×1
encoding ×1
inputstream ×1
netbeans ×1
reflection ×1
ruby ×1
text-files ×1
unit-testing ×1
windows ×1
windows-8 ×1
xls ×1