标签: file-io

如何从磁盘获得良好的并发读取性能

我想问一个问题,然后用我自己的答案跟进,但也看看其他人有什么答案.

我们有两个大文件,我们想同时从两个独立的线程中读取.一个线程将顺序读取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时都是可重复的.

windows file-io multithreading

26
推荐指数
2
解决办法
7099
查看次数

Java .properties文件相当于Ruby?

我需要在文件中存储一些简单的属性并从Ruby访问它们.

我非常喜欢.properties文件格式,它是Java中这类东西的标准(使用java.util.Properties类)......它简单易用,易于阅读.

那么,是否有一个Ruby类可以让我从这样的文件中加载一些键值对而不需要花费太多精力?

我不想使用XML,所以请不要建议REXML(我的目的不保证"尖括号税").

我考虑过滚动我自己的解决方案......它可能是大约5到10行的代码顶部,但我仍然宁愿使用现有的库(如果它本质上是从文件构建的散列)......就像那样把它降到一线......


更新:它实际上是一个直接的Ruby应用程序,而不是rails,但我认为YAML会做得很好(它在我的脑海里,但我已经忘记了它......已经看过但从未使用过),谢谢大家!

ruby file-io

26
推荐指数
4
解决办法
2万
查看次数

Java BufferedReader回到文本文件的顶部?

我目前BufferedReader在同一文本文件上初始化了2 秒.当我用第一个文本文件读完文本文件时BufferedReader,我使用第二个文本文件从顶部再次传递文件.需要多次通过同一个文件.

我知道reset(),但它需要先调用,mark()mark()需要知道文件的大小,我不认为我应该打扰.

想法?包?库?码?

谢谢TJ

java file-io file bufferedinputstream text-files

26
推荐指数
2
解决办法
7万
查看次数

使用反射更改静态最终File.separatorChar进行单元测试?

具体来说,我正在尝试为一个方法创建单元测试,该方法需要用于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)

思考?

java reflection file-io unit-testing

26
推荐指数
1
解决办法
2万
查看次数

我必须关闭FileInputStream吗?

我是测试自动化的实习生.我正在使用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功能?如果是这样,请指导我一些编码.

java file-io inputstream

26
推荐指数
5
解决办法
4万
查看次数

C++ ofstream文件写入是否使用缓冲区?

下面是两个将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)

c++ file-io file

26
推荐指数
2
解决办法
3万
查看次数

允许范围外的行号(65536)无效(0..65535)

我正在从文本文件中读取整数,将它们作为查询的输入并获取查询输出并写入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)

java file-io xls

26
推荐指数
1
解决办法
4万
查看次数

调用等待GetFileAsync()永远不会返回,应用程序在WinRT应用程序中挂起

我试图在应用程序启动时加载和读取设置文件,大约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)."

有没有人知道这里发生了什么?

c# file-io async-await windows-8 windows-runtime

26
推荐指数
1
解决办法
1万
查看次数

使用java读取utf-8编码的文本文件

我在使用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)

还有其他想法吗?

谢谢

java file-io encoding netbeans

26
推荐指数
3
解决办法
12万
查看次数

如何删除Android上一个文件夹中的所有文件和文件夹

我使用此代码删除所有文件:

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]文件夹的位置.

我想删除文件夹及其所有子文件.
我怎么修改这个?

java file-io android

26
推荐指数
5
解决办法
5万
查看次数