如何解决资源不足:open_files错误

时间:2015-03-03 15:09:47

标签: prolog swi-prolog

file_in_directory(File):-
  working_directory(D,D),
  directory_files(D,Entries),
  member(File,Entries).

tree_file_in_directory(File):-
  file_in_directory(File),
  atom_codes('.treeliker',TreeLikerCodes),
  atom_codes(File, FileCode),
  append(_FileStripped,TreeLikerCode,FileCode).

run_tree_liker(File):-
   process_create(path(java), 
   ['-Xmx8gb','-cp', 'TreeLiker.jar', 'ida.ilp.treeLiker.TreeLikerMain','-batch', File], [stdout(pipe(Out)), process(PID)]).

forall(
   tree_file_in_directory(File),
   (
   run_tree_liker(File),
   run_weka(File, Lines)
   )
).

我有一个这样的程序,其中run_tree_liker/1run_weka/2使用process_create/3来运行java jar程序。第一个程序为目录中的每个.treeliker文件创建一个.arff文件。然后,运行weka部分使用.arff文件并向数据库断言一些事实。

目录中有大约1400个.treeliker文件并且程序运行,但是在Error: Not enough resources: open_files大约400后,它总是会被删除。如何让程序一次打开一个文件并在进程完成后关闭文件,以便不会发生此错误?

1 个答案:

答案 0 :(得分:1)

我需要使用setup_call_cleanup / 3并关闭/ 1

run_jar(Jar,Option,Lines):-
   setup_call_cleanup(
   process_create(path(java),['-jar',Jar,Option],[stdout(pipe(Out))]),
   read_lines(Out,Lines),
   close(Out)).

感谢Jan在邮件列表上。